Кажется, главный вывод не использовать ls
.В эпоху плейстоценового программирования Unix они использовали ls
;однако в наши дни ls
лучше всего ограничивается производством только для чтения человеком.Надежный сценарий для всего , который может быть добавлен в ваш сценарий (конечные строки, пробелы, китайские иероглифы, смешанные с ивритом и французским языком и т. Д.), Лучше всего достигается с помощью какой-либо формы сглаживания (как рекомендовано другими).здесь BashPitfalls ).
#!/bin/bash
for file in ./*; do
[ -e "${file}" ] || continue
# do some task, for example, test if it is a directory.
if [ -d "${file}" ]; then
echo "${file}"
fi
done
Возможно, ./
не является абсолютно необходимым, но может помочь, если файл начинается с "-", уточняя, какой файл имеет строку возврата(или линии), и, вероятно, некоторые другие неприятные ошибки.Это также полезный шаблон для определенных файлов (.eg, ./*.pdf
).Например, предположим, что каким-то образом в вашем каталоге находятся следующие файлы: "-t" и "<CR>
t".Затем (выявление других проблем с ls
при использовании нестандартных символов)
$ ls
-t ?t
$ for file in *; do ls "${file}"; done
-t ?t
?t
, тогда как:
$ for file in ./*; do ls "${file}"; done
./-t
./?t
также
$ for file in ./*; do echo "${file}"; done
./-t
./
t
Обходной путь с помощью команд POSIX можетбыть достигнутым --
$ for file in *; do ls -- "${file}"; done # work around
-t
?t