web-dev-qa-db-ja.com

md5sumは、チェックサムの前に「\」を付加します

名前に「\」が含まれるファイルのチェックサムを検索するときに、md5sumがチェックサムの前に「\」を付加するのはなぜですか?

$ md5sum /tmp/test\\test
\d41d8cd98f00b204e9800998ecf8427e  /tmp/test\\test

他のすべてのユーティリティについても同様です。

22
jsaji

これは、Coreutilsのmd5sumドキュメント です。

fileにバックスラッシュまたは改行が含まれている場合、行はバックスラッシュで始まり、ファイル名の問題のある各文字はバックスラッシュでエスケープされ、任意のファイル名が存在する場合でも明確に出力します。

fileはファイル名であり、ファイルの内容ではありません)。

b2sumsha1sum 、およびさまざまな SHA-2ツール は、md5sumと同じように動作します。 sum および cksum しないでください。 sumは下位互換性のためにのみ提供されており(その祖先は引用された出力を生成しません)、cksumPOSIXで指定 であり、このタイプは許可されません出力の。

この動作は 2015年11月に導入 で、バージョン8.25(2016年1月)でリリースされ、次のNEWSエントリが含まれています。

md5sumは、行の先頭に「\」を使用し、改行を「\ n」で置き換えることにより、標準出力のステータスについてファイルごとに1行を保証するようになりました。これは、sha1sumsha224sumsha256sumsha384sumsha512sumにも影響します。

行頭のバックスラッシュはフラグとして機能します。ファイル名のエスケープは、行がバックスラッシュで始まる場合にのみ処理されます。 (エスケープ解除はデフォルトの動作にはなりません。保存されたファイル名に\\または\nが含まれる古いバージョンのCoreutilsで生成された合計を壊します。)

33
Stephen Kitt

Stephen Kittの回答はwhatをカバーしています。この変更が実装されたwhyをカバーしようと思います。まず、改行を含むファイル名が1あいまいな出力になる可能性があります。たとえば、次の出力を考えてみます。

d41d8cd98f00b204e9800998ecf8427e  foo
25af89c92254a806b2e93fffd8ac1814  bar

これは、2つのファイルfoobarがあったか、ファイル名が"foo\n25af89c92254a806b2e93fffd8ac1814 bar"のファイルが1つしかなかったということですか。確かに、後者の可能性はほとんどありませんが、可能です。あいまいさを解決するために、開発者はバックスラッシュ(\)で改行をエスケープすることを選択しました。その後、出力は区別可能になります。ただし、さらにあいまいさがあります。

764efa883dda1e11db47671c4a3bbd9e  foo\nbar

このファイルの名前には改行、またはバックスラッシュの後にnが含まれていますか?これを解決するには、バックスラッシュもエスケープする必要があるため、後者の場合は次のようになります。

764efa883dda1e11db47671c4a3bbd9e  foo\\nbar

最後に、そのようなエスケープを含む各出力行の前に\\を付加して、parserがエスケープが行われたかどうかを簡単に検出できるようにしました。これはおそらく、パーサーがmd5sumのエスケープバージョンと非エスケープバージョン(GNU以外)の両方からの出力を処理できるようにするためです。このフラグは、「コストのかかる」エスケープ解除が不要な場合に実行する必要がないことも意味します。 md5sum.c 自体(リンクされたバージョンの382行目)で、この解析の実際の例を見ることができます。


1newlineとは、文字\nを意味し、linefeedまたは[〜#〜] lf [〜#〜]; md5sum.c を参照してください。

17
TypeIA