2016-01-05 140 views
0

我必须编写一个命令,我们必须找到文件,计算一个md5代码,然后将其放入文本文件中。找到这些文件并不难,只是将stdin作为参数传递给sed

find -type f 

现在我有一个文件列表,并为每个文件我必须要找到MD5码。我知道代码生成MD5码

openssl dgst -md5 <file> 

但我怎么使用管道(无脚本)有类似this`

filename md5code 

我已经尝试过

while read line do... done 

但那没用。我认为我必须使用sed,但我现在不是真的如何。我最近尝试(我认为)是这样的:

find dir -type f | sed "s/^\(.*\)$/\1 $(openssl dgst -md5 \1)/" >> file.txt 

但它不承认\ 1 ...

我在找到这样的-exec选项试了一下:

md5$ find dir -type f -exec sed "s/^\(.*\)$/\1 $(openssl dgst -md5 {})/" \; 

但它不承认{}

回答

1

你的命令替换不会单引号内的工作,而且,我会建议使用-exec开关而不是管道。你也可以使用-print(或-printf,如果你的版本的find支持的话),尽管文件名被包含在我系统的openssl命令的输出中,所以也许你不需要它。试试这个:

find . -type f -printf '%f ' -exec openssl dgst -md5 {} \; 
+0

谢谢!这工作,没有想到-printf。 – micro

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返回的文件列表xargs选项告诉它使用NULL而不是空格来分隔输入项目。

注意:这将与GNU版本的这些工具一起使用。我不知道其他版本,因为它不被POSIX specification for find采用。