Vous pouvez également utiliser la printfcommande, au lieu de l'écho:
printf '%s\n' *
printfest supérieur à echodans cette situation en ce queecho il ne respecte pas le "double tiret" ( --) pour signifier la fin de la liste des arguments (sur certains systèmes, dont Ubuntu 14.04 sur lequel je l'ai testé):
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
Dans ce cas, vous ne pouvez pas obtenir le résultat souhaité avec echo(car un fichier appelé -nest interprété comme une option et le double tiret ne fonctionne pas, vous devez donc utiliser printf).
Notez que vous devez toujours utiliser une chaîne de format comme celle ci-dessus lorsque vous traitez avec des données inconnues printf, car sinon vous pourriez recevoir des résultats inattendus (merci à @ G-Man de l'avoir signalé dans les commentaires!):
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
Un fichier appelé \n est interprété comme une nouvelle ligne par printf. Pour éviter cela, nous utilisons une chaîne de formatage pour printf( %s) et lui passons les noms des fichiers (développés via globbing, comme précédemment).
Cette printfsolution de chaîne de formatage + peut gérer une grande variété de noms de fichiers (et traite également les fichiers "cachés", c'est-à-dire ceux commençant par un. , les mêmes 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
Si vos printfsupports %q, vous pouvez également utiliser cela ( printf '%q\n' *). Cela échappera aux espaces, aux nouvelles lignes, etc. s'il y a des caractères étranges dans vos noms de fichiers. (Merci à @muru dans le chat pour l'avoir signalé !)
libc*sold-linux*so