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

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

名前に "\"が含まれるファイルのチェックサムを見つけると、md5sumがチェックサムの前に "\"を追加するのはなぜですか?

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

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

答え1

これはファイルに書き込む、Coreutils の場合md5sum:

もし文書バックスラッシュまたは改行文字を含み、行はバックスラッシュで始まり、ファイル名に問題があるすべての文字はバックスラッシュでエスケープされるため、任意のファイル名があっても出力はあいまいになりません。

文書ファイルの内容ではなくファイル名です。)

b2sumsha1sum、そして様々なSHA-2ツール動作はと同じですmd5sumsumそしてcksumいいえ。sum以前のバージョンとの互換性のみを提供します(そしてその祖先は引用された出力を生成しません)。cksumはい。POSIXで指定このタイプの出力は許可されません。

この行動は2015年11月発売バージョン 8.25 (2016 年 1 月) では、次の項目が含まれてリリースされましたNEWS

md5sum次に、行の先頭に「\」を使用し、改行を「\ n」に置き換えて、各ファイルが標準出力にステータスを表示していることを確認してください。これは、にもsha1sum影響しsha224sumます。sha256sumsha384sumsha512sum

行の先頭のバックスラッシュはフラグとして使用されます。ファイル名のエスケープは、行がバックスラッシュで始まる場合にのみ処理されます。 (エスケープ解除はデフォルトの動作ではありません。保存したファイル名を含める\\か、保存した以前のバージョンのCoreutilsで生成された合計を破棄することができます。)\n

答え2

Stephen Kittの答えは次のとおりです。カバーしてみましょう。なぜこの変更が実装されました。まず、改行文字1を含むファイル名が以下を引き起こす可能性があることが観察されました。あいまいな出力。たとえば、次の出力を考えてみましょう。

d41d8cd98f00b204e9800998ecf8427e  foo
25af89c92254a806b2e93fffd8ac1814  bar

fooこれは2つのファイルとがあることを意味しますかbar、それとも名前が1つのファイルだけであることを意味しますか"foo\n25af89c92254a806b2e93fffd8ac1814 bar"?もちろん、後者の可能性はほとんどありませんが、可能です。あいまいさを解決するために、開発者はバックスラッシュ(\)を使用して改行をエスケープすることにしました。これにより、出力が区別可能になります。しかし、もっと曖昧な点があります。

764efa883dda1e11db47671c4a3bbd9e  foo\nbar

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

764efa883dda1e11db47671c4a3bbd9e  foo\\nbar

最後に、彼らはこれらのエスケープ文字を含むすべての出力行の前にを追加することにしました\\パーサー脱出が完了したことを確認してください。おそらく、これはパーサーがmd5sumエスケープされたバージョンとエスケープされていない(非GNU)バージョンの両方の出力を処理できるようにするために行われたようです。このフラグはまた、必要でないときに「高価な」エスケープを必要としないことを意味します。この構文解析の例は次のとおりです。md5sum.c自体(リンクされたバージョンの382行)。


1新しいチーム私の言葉は\n時々具体的に呼ばれます。改行またはもし;バラよりmd5sum.c

関連情報