使用“>”将 xargs 参数作为字符串传递给另一个命令?

使用“>”将 xargs 参数作为字符串传递给另一个命令?

假设我有一堆文件/tmp/

我愿意

find . -type f | xargs -iFILES

我想md5sum在每个文件中执行 a,输出到具有相同名称但具有.md5扩展名的文件。

find . -type f | xargs -iFILES md5sum FILES > FILES.md5

这应该为 find 命令找到的每个文件创建一个 md5 文件。相反,它会在磁盘上创建一个 FILES.md5 文件,其中包含所有文件的校验和。

如何对 md5sum 命令说 FILES 代表当前文件名而不是 FILES 文字字符串?

答案1

您需要使用子shell来处理IO重定向:

find . -type f | xargs -iFILES sh -c 'md5sum FILES > FILES.md5'

答案2

使用 GNU Parallel,您可以执行以下操作:

find . -type f | parallel md5sum {} \> {}.md5

您可以获得并行运行 md5sum 的额外好处,并且文件如下:

My brother's 12" records.txt

不会导致你的命令崩溃。观看介绍视频以了解更多信息:http://www.youtube.com/watch?v=OpaiGYxkSuQ

答案3

您需要某种方式来表示要将输出发送md5sum到文件。由于find(或xargs) 没有内置此功能,并且md5sum只知道如何打印到标准输出,因此 shell 重定向是最直接的方法。

请注意,由于另一个原因,您的命令在一般情况下不起作用: 的输出格式find不是 的输入格式xargs,它们与包含空格或 的文件名不同\"'。代替使用find -exec

find . -type f -exec sh -c 'md5sum "$0" >"$0.md5"' {} \;

相关内容