如何摆脱 cpio 给出的“blocks”消息?

sda*_*aau 2 pipe io-redirection shell-script

我正在尝试研究这个:如何将目录内容的 MD5 总和作为一个总和?,所以我正在尝试:

$ find | LC_ALL=C sort | cpio -o | md5sum
25324 blocks
6631718c8856606639a4c9b1ef24d420  -
Run Code Online (Sandbox Code Playgroud)

嗯...我只想要哈希值,而不是输出中的任何其他内容...因此假设“25324 个块”已打印到 stderr,我尝试将 stderr 重定向到/dev/null

$ find | LC_ALL=C sort | cpio -o | md5sum 2>/dev/null 
25324 blocks
6631718c8856606639a4c9b1ef24d420  -
Run Code Online (Sandbox Code Playgroud)

不,不是这样的。为了测试起见,我们尝试将 stdout 重定向到/dev/null

$ find | LC_ALL=C sort | cpio -o | md5sum 1>/dev/null 
25324 blocks
Run Code Online (Sandbox Code Playgroud)

好的,哈希值按预期消失了 - 但“块”消息仍然存在?!通过文件描述符 3 打印的“25324 个块”到底在哪里?!:

$ find | LC_ALL=C sort | cpio -o | md5sum 3>/dev/null 
25324 blocks
6631718c8856606639a4c9b1ef24d420  -
Run Code Online (Sandbox Code Playgroud)

不,不是这样......无论如何,我可以用 awk 得到哈希值:

$ find | LC_ALL=C sort | cpio -o | md5sum | awk '{print $1}'
25324 blocks
6631718c8856606639a4c9b1ef24d420
Run Code Online (Sandbox Code Playgroud)

但仍然打印了该死的“块”消息...那么它是如何打印到终端的(因为它似乎没有通过 stdout 或 stderr 打印),以及如何抑制该消息?


编辑:找到答案,“块”消息cpio实际上是打印的,所以正确的做法是:

$ find | LC_ALL=C sort | cpio -o 2>/dev/null | md5sum | awk '{print $1}'
6631718c8856606639a4c9b1ef24d420
Run Code Online (Sandbox Code Playgroud)

现在我们只有哈希值......

Ste*_*itt 5

该消息由 打印cpio,这可以避免它:

\n\n
find | LC_ALL=C sort | cpio -o 2> /dev/null | md5sum | awk \'{print $1}\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

cpio如果使用此方法,您\xe2\x80\x99将丢失打印的任何错误消息。某些版本cpio(至少 GNU 和 FreeBSD)支持一个quiet选项:

\n\n
find | LC_ALL=C sort | cpio -o --quiet | md5sum | awk \'{print $1}\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

cpio为了避免丢失不支持 xe2x80x99t 的版本的错误--quiet,您可以将它们记录到临时文件中:

\n\n
cpiolog=$(mktemp); find | LC_ALL=C sort | cpio -o 2> "${cpiolog}" | md5sum | awk \'{print $1}\'; grep -v blocks "${cpiolog}"; rm -f "${cpiolog}"\n
Run Code Online (Sandbox Code Playgroud)\n