在std中将stdin作为参数传递

时间:2016-01-05 09:12:35

标签: shell unix sed command stdin

我必须写一个命令,我们必须找到文件,计算一个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 {} )/" \;

但它无法识别{}

2 个答案:

答案 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 -mdxargs命令将文件列表作为输入,然后使用这些命令作为md5sum命令的参数来构建命令。

如果您的文件名包含空格或其他异常字符,则需要使用:

find dir -type f -print0 | xargs -0 md5sum >> file.txt

-print0选项使用NULL字符分隔find命令返回的文件列表,-0, --null的{​​{1}}选项告诉它使用NULL代替用空格来分隔输入项。

注意:这将适用于这些工具的GNU版本。我不知道其他版本,因为POSIX specification for find没有采用它。