使用find . -print0
似乎是在Bash中获取文件列表的唯一安全方式,因为文件名可能包含空格、换行符、引号等。
然而,我很难在Bash或其他命令行工具中实际利用find的输出。我唯一成功利用输出的方法是将其管道到perl,并将perl的IFS更改为空值:
find . -print0 | perl -e '$/="\0"; @files=<>; print $#files;'
这个示例打印找到的文件数,避免了文件名中换行符对计数造成的破坏,而这种情况会发生在以下代码中:
find . | wc -l
由于大多数命令行程序不支持空字符分隔的输入,我认为最好的方法是像我在上面的Perl片段中所做的那样,在bash数组中捕获find . -print0
的输出,然后继续处理任务。
我该如何做到这一点?
这种方法行不通:
find . -print0 | ( IFS=$'\0' ; array=( $( cat ) ) ; echo ${#array[@]} )
一个更加普遍的问题可能是:如何在bash中使用文件列表来执行有用的操作?