Como posso imprimir uma lista de arquivos/diretórios um por linha usando echo
?
Eu posso substituir espaços por novas linhas, mas isso não funciona se os nomes dos arquivos contiverem espaços:
$ echo small*jpg
small1.jpg small2.jpg small photo 1.jpg small photo 2.jpg
$ echo small*jpg | tr ' ' '\n'
small1.jpg
small2.jpg
small
photo
1.jpg
small
photo
2.jpg
Eu sei que posso fazer isso com ls -d1
, mas também é possível usar echo
?
echo
não pode ser usado para produzir dados arbitrários de qualquer maneira, useprintf
em vez disso que é a substituição POSIX para o utilitário quebradoecho
para produzir texto.Você também pode fazer:
para produzir a lista em registros delimitados por NUL (para que possa ser pós-processado; por exemplo, usando GNU
xargs -r0
; lembre-se de que o caractere de nova linha é tão válido quanto o espaço ou qualquer caractere em um nome de arquivo).Antes do POSIX surgir
printf
, o ksh já tinha umprint
utilitário para substituirecho
. zsh copiou e adicionou uma-l
opção para imprimir os argumentos um por linha:ksh93 adicionou uma
-f
opçãoprint
paraprintf
impressão semelhante. Copiado porzsh
também, mas não por outras implementações ksh:Observe que todos eles ainda imprimem uma linha vazia se não houver nenhum argumento. Um melhor
println
pode ser escrito como uma função como:Em
zsh
:echo
usa apenas espaços para separar as strings que recebe como argumentos.Como sua pergunta está marcada como bash , aqui está o que
help echo
dizbash
(ênfase minha):Declarações semelhantes são encontradas na documentação para outras implementações. Por exemplo, de
echo
fromcoreutils
, que você provavelmente encontrará no GNU/Linux:Se você realmente deseja
echo
imprimir seus nomes de arquivos em linhas separadas, deve alimentá-los como uma única string:Aqui estamos aproveitando o comportamento do
*
parâmetro especial: entre aspas duplas, ele se expande para uma única palavra na qual os elementos da matriz de parâmetros posicionais são concatenados usando o primeiro caractere daIFS
variável (que definimos como uma nova linha).A
(...)
sintaxe é usada para executar os comandos em um ambiente de subshell — geralmente não queremos afetar o principal.Observe, no entanto, que as
echo
limitações de todos ainda se aplicam, conforme mencionado na resposta de Stéphane e, portanto, seu uso neste cenário não é aconselhável.