【发布时间】:2010-11-10 03:51:07
【问题描述】:
使用find . -print0 似乎是在 bash 中获取文件列表的唯一安全方法,因为文件名可能包含空格、换行符、引号等。
但是,我很难真正让 find 的输出在 bash 或其他命令行实用程序中有用。我设法利用输出的唯一方法是将其通过管道传输到 perl,并将 perl 的 IFS 更改为 null:
find . -print0 | perl -e '$/="\0"; @files=<>; print $#files;'
此示例打印找到的文件数,避免文件名中的换行符破坏计数的危险,如下所示:
find . | wc -l
由于大多数命令行程序不支持以 null 分隔的输入,我认为最好的办法是在 bash 数组中捕获 find . -print0 的输出,就像我在上面的 perl sn-p 中所做的那样,然后继续任务,不管它是什么。
我该怎么做?
这不起作用:
find . -print0 | ( IFS=$'\0' ; array=( $( cat ) ) ; echo ${#array[@]} )
一个更普遍的问题可能是:我怎样才能用 bash 中的文件列表做有用的事情?
【问题讨论】:
-
做有用的事情是什么意思?
-
哦,你知道,数组通常有用的地方是:找出它们的大小;迭代它们的内容;向后打印它们;对它们进行排序。那种事。 unix 中有很多实用程序可以处理数据:wc、bash 的 for 循环、tac 和 sort;但是在处理可能包含空格或换行符的列表时,这些似乎都没有用。 IE。文件名。使用空值输入字段分隔符传递数据似乎是解决方案,但很少有实用程序可以处理这个问题。
-
这是一篇关于如何在 shell 中正确处理文件名的文章,有很多细节:http://www.dwheeler.com/essays/filenames-in-shell.html
标签: arrays bash null find delimiter