![使用“>”将 xargs 参数作为字符串传递给另一个命令?](https://linux22.com/image/42639/%E4%BD%BF%E7%94%A8%E2%80%9C%3E%E2%80%9D%E5%B0%86%20xargs%20%E5%8F%82%E6%95%B0%E4%BD%9C%E4%B8%BA%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%BC%A0%E9%80%92%E7%BB%99%E5%8F%A6%E4%B8%80%E4%B8%AA%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
假设我有一堆文件/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"' {} \;