Использование find . -print0
представляется единственным безопасным способом получения списка файлов в bash из-за возможности имен файлов, содержащих пробелы, символы новой строки, кавычки и т. Д.
Тем не менее, мне трудно на самом деле сделать вывод find полезным в bash или с другими утилитами командной строки. Единственный способ, которым мне удалось использовать вывод, - это передать его в perl и изменить IFS в perl на null:
find . -print0 | perl -e '$/="\0"; @files=<>; print $#files;'
В этом примере печатается количество найденных файлов, что исключает опасность появления новых строк в именах файлов, приводящих к искажению счетчика, как это происходит с:
find . | wc -l
Поскольку большинство программ командной строки не поддерживают ввод с разделителями, равными нулю, я полагаю, что лучше всего было бы захватить вывод find . -print0
в массив bash, как я делал в приведенном выше фрагменте perl, и затем продолжить задача, какой бы она ни была.
Как я могу это сделать?
Это не работает:
find . -print0 | ( IFS=$'\0' ; array=( $( cat ) ) ; echo ${#array[@]} )
Гораздо более общий вопрос: Как я могу делать полезные вещи со списками файлов в bash?