cpioが提供する「ブロック」メッセージを削除する方法は?

cpioが提供する「ブロック」メッセージを削除する方法は?

私はこれを見ようとしています:ディレクトリの内容の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を使用してください。

関連情報