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

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

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

$ find | LC_ALL=C sort | cpio -o | md5sum
25324 blocks
6631718c8856606639a4c9b1ef24d420  -

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

$ find | LC_ALL=C sort | cpio -o | md5sum 2>/dev/null 
25324 blocks
6631718c8856606639a4c9b1ef24d420  -

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

$ find | LC_ALL=C sort | cpio -o | md5sum 1>/dev/null 
25324 blocks

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

$ find | LC_ALL=C sort | cpio -o | md5sum 3>/dev/null 
25324 blocks
6631718c8856606639a4c9b1ef24d420  -

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

$ find | LC_ALL=C sort | cpio -o | md5sum | awk '{print $1}'
25324 blocks
6631718c8856606639a4c9b1ef24d420

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


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

$ find | LC_ALL=C sort | cpio -o 2>/dev/null | md5sum | awk '{print $1}'
6631718c8856606639a4c9b1ef24d420

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

答案1

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

find | LC_ALL=C sort | cpio -o 2> /dev/null | md5sum | awk '{print $1}'

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

find | LC_ALL=C sort | cpio -o --quiet | md5sum | awk '{print $1}'

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

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

答案2

此消息由 打印cpio。使用 GNU cpio 或 FreeBSD cpio,传递--quiet选项以抑制它。

或者放弃 cpio 并使用标准 pax 或更常见的 tar 代替。

相关内容