Я хочу получить список файлов в текущем каталоге и его подкаталогах (я хочу использовать однострочный скрипт):
IFS=$(echo -en "\n\b");
for FILE in $(find -type f); do echo "$FILE"; done
Обычно это работает, как и ожидалось, но недавно, с моим списком файлов:
file_.doc
file_0.doc
file_ [2006_02_25] .doc
file_ [2016_06_16] .odt
file_ [2016_06_16] .pdf
file_ [16-6-2006] .doc
file_.pdf
file_ 4-4-2006.doc
выход:
./file_.doc
./file_0.doc
./file_0.doc
./file_[2016_06_16].odt
./file_[2016_06_16].pdf
./file_0.doc
./file_.pdf
./file_ 4-4-2006.doc
Если я изменю переменную IFS на:
IFS=$(echo -en "\n");
тогда вывод будет (исправлен):
./file_.doc
./file_0.doc
./file_[2006_02_25].doc
./file_[2016_06_16].odt
./file_[2016_06_16].pdf
./file_[16-6-2006].doc
./file_.pdf
./file_ 4-4-2006.doc
Я прочитал, что '\b'
это необходимо , и нашел решение, которое использует printf
вместоecho
.
Мои вопросы:
1) Не могли бы вы объяснить, что отличало эти результаты?
2) Решение, использующее printf
выше, может быть альтернативой echo -en "\n\b"
?
Не делать
$( find ... )
. Это вызовет генерацию имени файла (globbing), и некоторые из ваших имен файла будут интерпретированы как шаблоны globbing, которые соответствуют другим именам файла. Например, шаблонfile_[2006_02_25].doc
иfile_[16-6-2006].doc
совпадения,file_0.doc
поэтому это имя файла встречается вместо этих двух шаблонов.Более того, ваш цикл не будет повторяться до тех пор, пока
find
команда в подстановке команд не сгенерирует все свои пути, которые в общем случае могут занимать довольно много памяти и не очень элегантны .Вместо этого просто используйте
find
(и не изменяйтеIFS
):Если вы хотите сделать другие вещи с этими файлами, то вы можете сделать это в
-exec
:Если вы просто хотите обработать файлы в текущем каталоге, вы можете просто
Связанный:
источник
-exec
для выполнения необходимый код для каждого файла или группы файлов. Я не смог написать что-то более конкретное по этому поводу, потому что вопрос не в том, как это сделать, а в том, почему вы получаете разные результаты с помощью своего кода.