Ви можете також використовувати printfкоманду замість відлуння:
printf '%s\n' *
printfechoв цій ситуації перевершує те, echoщо не поважає "подвійний тире" ( --) для позначення кінця списку аргументів (для деяких систем, включаючи Ubuntu 14.04, на що я тестував його):
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
У цьому випадку ви не можете досягти бажаного результату echo(оскільки викликаний файл -nінтерпретується як опція, а подвійний тире не працює, тому потрібно використовувати printf).
Зауважте, що ви завжди повинні використовувати рядок формату, як описано вище, при роботі з невідомими даними printf, оскільки в іншому випадку ви можете отримати несподівані результати (дякую @ G-Man за те, що це вказало в коментарях!):
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
Файл, що викликається \n, інтерпретується як новий рядок printf. Щоб уникнути цього, ми використовуємо рядок форматування для printf( %s) і передаємо йому імена файлів (розширені через глобування, як і раніше).
Це printf+ рядкове рішення форматування може обробляти найрізноманітніші назви файлів (а також обробляє "приховані" файли, тобто ті, що починаються з a ., те саме, що 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
Якщо ви printfпідтримуєте %q, ви також можете використовувати це ( printf '%q\n' *). Це дозволить уникнути пробілів, нових рядків тощо, якщо у ваших іменах є якісь дивні символи. (Дякую @muru в чаті, що вказав на це !)
libc*soчи свогоld-linux*so