我正在尝试查看这个:如何将目录内容的 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 代替。