使用 'xargs' 进行 'find'

使用 'xargs' 进行 'find'

考虑:

cat fileNames.txt | xargs find . -name

我希望上述命令能够找到 fileNames.txt 中每个文件名的路径,但该命令没有产生任何输出。为什么?

答案1

解决办法是:

 xargs --max-args=1 find . -iname < fileNames.txt

答案2

常规xargs调用会删除换行符,将输入的所有行放在单个命令行中。但是,您可以使用选项-I <pattern>,其中将为每一行输入调用一个命令,并<pattern>用行内容替换。

还请注意,您可能应该添加-print列出路径的选项。

cat fileNames.txt | xargs -I {} find . -name {} -print

答案3

-name选项仅接受一个参数。我不确定为什么你没有收到错误消息。尝试

sed 's/.*/-name "&"/' fileNames.txt | xargs find .

答案4

到目前为止,答案对于包含空格、' 或 " 的文件名很难回答:

$ echo \'\ \" |  xargs -I {} find . -name {} -print
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option

$ echo \'\ \" | sed 's/.*/-name "&"/' | xargs find .
xargs: unmatched double quote; by default quotes are special to xargs unless you use the -0 option
find: missing argument to `-name'

如果文件是由用户制作的,您将要体验有趣的命名文件。如果您安装了 GNU Parallel,您可以执行以下操作:

cat fileNames.txt | parallel find . -name {} -print

观看介绍视频以了解有关 GNU Parallel 的更多信息:http://www.youtube.com/watch?v=OpaiGYxkSuQ

GNU Parallel 可以在以下网址下载:ftp://ftp.gnu.org/gnu/parallel/据报道,它在 Cygwin 下运行。

相关内容