Możesz także użyć printf
polecenia zamiast echa:
printf '%s\n' *
printf
jest lepszy echo
w tej sytuacji, że echo
nie nie przestrzega zasady „podwójną kreskę” ( --
) oznaczać końca listy argument (w niektórych systemach, w tym Ubuntu 14.04, który jest co testowałem go):
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
W takim przypadku nie można osiągnąć pożądanego rezultatu za pomocą echo
(ponieważ plik o nazwie -n
zostaje zinterpretowany jako opcja, a podwójne myślenie nie działa, więc musisz użyć printf
).
Pamiętaj, że zawsze powinieneś używać ciągu formatu takiego jak powyższy, gdy printf
masz do czynienia z nieznanymi danymi , ponieważ w przeciwnym razie możesz otrzymać nieoczekiwane wyniki (dzięki @ G-Man za wskazanie tego w komentarzach!):
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
Wywołany plik \n
jest interpretowany jako nowy wiersz przez printf
. Aby tego uniknąć, używamy ciągu formatującego dla printf
( %s
) i przekazujemy mu nazwy plików (rozwinięte przez globbing, jak poprzednio).
To printf
+ ciąg formatujący może obsługiwać wiele różnych nazw plików (a także traktuje pliki „ukryte”, to znaczy te zaczynające się od .
, takie same jak 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
Jeśli twoje printf
wsparcie %q
, możesz również użyć tego ( printf '%q\n' *
). Spowoduje to uniknięcie spacji, znaków nowej linii itp., Jeśli w nazwach plików znajdują się dziwne znaki. (Dzięki @muru na czacie za zwrócenie na to uwagi !)
libc*so
lub swójld-linux*so