将标准输入作为参数传递给 sed

Pass stdin as argument in sed

如果我们必须查找文件、计算 md5 代码然后将其放入文本文件,我必须编写一个命令。查找文件并不难,只是

find -type f

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

openssl dgst -md5 <file>

但是我如何使用管道(无脚本)来实现类似这样的东西`

filename md5code

我已经试过了

while read line do... done

但这没有用。我以为我必须使用 sed,但我现在真的不知道该怎么做。我最接近的尝试(我认为)是这样的:

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

但它无法识别 \1...

我在 find 中使用 -exec 选项尝试过,如下所示:

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

但它无法识别{}

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

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

您可以使用xargs命令来处理find命令返回的文件列表。

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

大多数 Unix-like 操作系统应该安装 md5sum 实用程序,所以我使用它而不是 openssl dgst -mdxargs 命令将文件列表作为输入,然后通过将这些文件用作 md5sum 命令的参数来构建命令。

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

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

-print0 选项使用 NULL 字符分隔 find 命令返回的文件列表,xargs-0, --null 选项告诉它使用NULL 而不是空格来分隔输入项。

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

采用