Eu quero criar uma lista de arquivos mp3 como a 1.mp3|a 2.mp3
.
Eu tentei echo ${(j:|:)$(echo *.mp3)}
e algumas variações dele, mas eles não funcionam:
# too much splitting
01|The|Magic|Finger|01.mp3|02|The|Magic|Finger|02.mp3|03|The|Magic|Finger|03.mp3|04|The|Magic|Finger|04.mp3|05|The|Magic|Finger|05.mp3|06|The|Magic|Finger|06.mp3
# too much quoting
01 The Magic Finger 01.mp3 02 The Magic Finger 02.mp3 03 The Magic Finger 03.mp3 04 The Magic Finger 04.mp3 05 The Magic Finger 05.mp3 06 The Magic Finger 06.mp3
Eu não quero criar funções ou variáveis para fazer isso. (Isso pode ser feito trivialmente.)
É um pouco bobo pegar a lista de arquivos mp3, passá-los para
echo
que possa imprimi-los separados por espaços, depois transferir essa saída por um pipe, lê-la, dividir em espaço/tab/nova linha/NUL e depois juntar com|
.Ou faça:
Ou
Se o objetivo for que isso seja usado como um
zsh
padrão, você provavelmente desejará escapar os caracteres curinga nos nomes desses arquivos. Isso é feito com ob
sinalizador de expansão do parâmetro:Eu encontrei uma maneira de fazer isso, mas ainda é bastante complicado para um caso de uso tão simples:
echo ${(j:|:)"${(@f)$(print -l *.mp3)}"}
Você pode usar
set
para agrupar esses arquivos em parâmetros posicionais e depois"$*"
expandi-los com o separador de campo desejado:Observe que isso está sendo feito em um subshell para que as alterações no IFS não afetem seu shell atual.