我必须写一个命令,我们必须找到文件,计算一个md5代码然后把它放到一个文本文件中。找到文件并不难,只需
find -type f
现在我有一个文件列表,对于每个文件,我必须找到md5代码。我知道生成md5代码的代码
openssl dgst -md5 <file>
但是我如何使用管道(没有脚本)来拥有这样的东西呢?
filename md5code
我已经尝试了
while read line do... done
但这不起作用。我认为我必须使用sed,但我现在不怎么样。我最接近的尝试(我认为)是这样的:
find dir -type f | sed "s/^\(.*\)$/\1 $( openssl dgst -md5 \1 )/" >> file.txt
但它不承认\ 1 ......
我在find中使用-exec选项尝试了这样:
md5$ find dir -type f -exec sed "s/^\(.*\)$/\1 $( openssl dgst -md5 {} )/" \;
但它无法识别{}
答案 0 :(得分:1)
您的命令替换不能在单引号内工作,但我也建议使用-exec
开关而不是管道。你也可以使用-print
(或-printf
,如果你的版本支持它),虽然文件名包含在我的系统openssl命令的输出中,所以也许你不需要它。试试这个:
find . -type f -printf '%f ' -exec openssl dgst -md5 {} \;
答案 1 :(得分:0)
您可以使用xargs
命令处理find
命令返回的文件列表。
find dir -type f | xargs md5sum >> file.txt
大多数类Unix操作系统应该安装md5sum
实用程序,所以我使用了它而不是openssl dgst -md
。
xargs
命令将文件列表作为输入,然后使用这些命令作为md5sum
命令的参数来构建命令。
如果您的文件名包含空格或其他异常字符,则需要使用:
find dir -type f -print0 | xargs -0 md5sum >> file.txt
-print0
选项使用NULL字符分隔find
命令返回的文件列表,-0, --null
的{{1}}选项告诉它使用NULL代替用空格来分隔输入项。
注意:这将适用于这些工具的GNU版本。我不知道其他版本,因为POSIX specification for find没有采用它。