web-dev-qa-db-ja.com

複数のファイルの名前をその内容のMD5合計に変更するにはどうすればよいですか?

一部のファイルの名前をその内容のMD5合計に変更したいと思います。たとえば、ファイルfooが空の場合は、名前をd41d8cd98f00b204e9800998ecf8427eに変更する必要があります。

スクリプトである必要がありますか、それともrenameツールのようなものを使用できますか?

4
Igor V.

グレンの答えは良いです。複数のファイルの改良点は次のとおりです。

md5sum file1 file2 file3 | # or *.txt, or whatever
    while read -r sum filename; do
        mv -v "$filename" "$sum"
    done

findなどでファイルを生成している場合は、md5sum呼び出しをfind . <options> -print0 | xargs -0 md5sumのようなものに置き換えることができます(出力もシェルループにパイプされます)。

これは、合計とそれに対応するファイルを含む複数の行で構成されるmd5sumの出力を取得し、それをシェルループにパイプして、各行を読み取り、mvコマンドを発行します。ファイルの名前を元の名前から合計に変更します。合計が同じファイルはすべて上書きされます。ただし、異常な状況(md5ハッシュの衝突で遊んでいる場合など)を除けば、同じ内容であるため、データが失われることはありません。各ファイルに他の操作を導入する必要がある場合は、元のファイル名とMD5合計をそれぞれ含む変数$filename$sumを参照して、それらをループに入れることができます。

7
Tom Hunt

zshの場合:

_autoload zmv # best in ~/.zshrc
zmv '**/*(#qD.)' '$(md5sum<$f)'
_

すべての通常のファイルの名前を再帰的に変更します。

(同じディレクトリ内の2つのファイルのチェックサムが同じである場合、ファイルの名前変更を拒否することに注意してください。それを上書きするには、_-f_を追加してください)。

**/*(#qD.)は、グロブ修飾子を使用したzshの再帰グロブです(隠しファイルを含めるには_(#q<qualifiers>)_、D、選択のみを行うには_._などの明示的な形式で通常ファイル。

4

bash:

md5sum my.file.here | { read sum filename; mv $filename $sum; }
3
glenn jackman