Вы также можете использовать printf
команду вместо echo:
printf '%s\n' *
printf
превосходит echo
в этой ситуации то, 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
решение + форматирование строки может обрабатывать самые разные имена файлов (а также обрабатывать «скрытые» файлы, то есть те, которые начинаются с .
, так же, как 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