Você também pode usar o printf
comando, em vez de echo:
printf '%s\n' *
printf
é superior a echo
nesta situação em que echo
se não respeitar o "traço duplo" ( --
) para significar o fim da lista de argumentos (em alguns sistemas, incluindo Ubuntu 14.04 que é o que eu testei-o em):
llama@llama:~$ mkdir -p Misc/unix210948
llama@llama:~$ cd !$
cd Misc/unix210948
llama@llama:~/Misc/unix210948$ touch -- -n
llama@llama:~/Misc/unix210948$ ls
-n
llama@llama:~/Misc/unix210948$ echo *
llama@llama:~/Misc/unix210948$ echo -- *
-- -n
llama@llama:~/Misc/unix210948$ printf '%s\n' *
-n
Nesse caso, você não pode obter o resultado desejado com echo
(já que um arquivo chamado -n
é interpretado como uma opção e o traço duplo não funciona, portanto, você deve usá-lo printf
).
Observe que você sempre deve usar uma string de formato como a acima ao lidar com dados desconhecidos printf
, pois caso contrário, poderá receber resultados inesperados (obrigado ao @ G-Man por apontar isso nos comentários!):
llama@llama:~/Misc/unix210948$ rm ./-n
llama@llama:~/Misc/unix210948$ touch '\n'
llama@llama:~/Misc/unix210948$ ls
\n
llama@llama:~/Misc/unix210948$ printf -- *
llama@llama:~/Misc/unix210948$ printf '%s\n' *
\n
Um arquivo chamado \n
é interpretado como uma nova linha por printf
. Para evitar isso, usamos uma string de formatação para printf
( %s
) e passamos os nomes dos arquivos (expandidos via globbing, como antes).
Essa printf
solução de sequência de formatação + pode lidar com uma grande variedade de nomes de arquivos (e também trata arquivos "ocultos", ou seja, aqueles que começam com a .
, da mesma forma que ls
):
llama@llama:~/Misc/unix210948$ rm ./*
zsh: sure you want to delete all the files in /home/llama/Misc/unix210948/. [yn]? y
llama@llama:~/Misc/unix210948$ touch -- '-n' '\n' 'name with spaces' '.hidden'
llama@llama:~/Misc/unix210948$ ls
-n \n name with spaces
llama@llama:~/Misc/unix210948$ printf '%s\n' *
-n
\n
name with spaces
Se você printf
suporta %q
, você também pode usar isso ( printf '%q\n' *
). Isso escapará a espaços, novas linhas etc. se houver caracteres estranhos em seus nomes de arquivos. (Obrigado a @muru no chat por apontar isso !)
libc*so
ou seuld-linux*so