名前に「\」が含まれるファイルのチェックサムを検索するときに、md5sumがチェックサムの前に「\」を付加するのはなぜですか?
$ md5sum /tmp/test\\test
\d41d8cd98f00b204e9800998ecf8427e /tmp/test\\test
他のすべてのユーティリティについても同様です。
これは、Coreutilsのmd5sum
の ドキュメント です。
fileにバックスラッシュまたは改行が含まれている場合、行はバックスラッシュで始まり、ファイル名の問題のある各文字はバックスラッシュでエスケープされ、任意のファイル名が存在する場合でも明確に出力します。
(fileはファイル名であり、ファイルの内容ではありません)。
b2sum
、 sha1sum
、およびさまざまな SHA-2ツール は、md5sum
と同じように動作します。 sum
および cksum
しないでください。 sum
は下位互換性のためにのみ提供されており(その祖先は引用された出力を生成しません)、cksum
は POSIXで指定 であり、このタイプは許可されません出力の。
この動作は 2015年11月に導入 で、バージョン8.25(2016年1月)でリリースされ、次のNEWS
エントリが含まれています。
md5sum
は、行の先頭に「\」を使用し、改行を「\ n」で置き換えることにより、標準出力のステータスについてファイルごとに1行を保証するようになりました。これは、sha1sum
、sha224sum
、sha256sum
、sha384sum
、sha512sum
にも影響します。
行頭のバックスラッシュはフラグとして機能します。ファイル名のエスケープは、行がバックスラッシュで始まる場合にのみ処理されます。 (エスケープ解除はデフォルトの動作にはなりません。保存されたファイル名に\\
または\n
が含まれる古いバージョンのCoreutilsで生成された合計を壊します。)
Stephen Kittの回答はwhatをカバーしています。この変更が実装されたwhyをカバーしようと思います。まず、改行を含むファイル名が1あいまいな出力になる可能性があります。たとえば、次の出力を考えてみます。
d41d8cd98f00b204e9800998ecf8427e foo
25af89c92254a806b2e93fffd8ac1814 bar
これは、2つのファイルfoo
とbar
があったか、ファイル名が"foo\n25af89c92254a806b2e93fffd8ac1814 bar"
のファイルが1つしかなかったということですか。確かに、後者の可能性はほとんどありませんが、可能です。あいまいさを解決するために、開発者はバックスラッシュ(\
)で改行をエスケープすることを選択しました。その後、出力は区別可能になります。ただし、さらにあいまいさがあります。
764efa883dda1e11db47671c4a3bbd9e foo\nbar
このファイルの名前には改行、またはバックスラッシュの後にn
が含まれていますか?これを解決するには、バックスラッシュもエスケープする必要があるため、後者の場合は次のようになります。
764efa883dda1e11db47671c4a3bbd9e foo\\nbar
最後に、そのようなエスケープを含む各出力行の前に\\
を付加して、parserがエスケープが行われたかどうかを簡単に検出できるようにしました。これはおそらく、パーサーがmd5sum
のエスケープバージョンと非エスケープバージョン(GNU以外)の両方からの出力を処理できるようにするためです。このフラグは、「コストのかかる」エスケープ解除が不要な場合に実行する必要がないことも意味します。 md5sum.c
自体(リンクされたバージョンの382行目)で、この解析の実際の例を見ることができます。
1newlineとは、文字\n
を意味し、linefeedまたは[〜#〜] lf [〜#〜]; md5sum.c
を参照してください。