
一部のファイルの名前をその内容のMD5の合計に変更したいと思います。たとえば、ファイルが空のfoo
場合、名前をd41d8cd98f00b204e9800998ecf8427e
。
スクリプトでなければなりませんか、それともrename
ツールのようなものを使用できますか?
答え1
Glennの答えは素晴らしいです。マルチドキュメントが改善されました。
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
これは、複数の行と合計、対応するファイルで構成され、各行を読み取り、ファイル名を元の名前から sum に変更するコマンドを実行するシェルループにパイプされる出力ですmv
。同じ量のファイルは上書きされます。ただし、奇妙なことが起こらない限り(たとえば、md5ハッシュ競合を処理する場合)、これはそのファイルの内容が同じであるため、とにかくデータが失われないことを意味します。各ファイルに追加の操作を導入する必要がある場合は、元のファイル名とMD5の合計をそれぞれ含む変数を参照$filename
してループに入れることができます。$sum
答え2
そしてzsh
:
autoload zmv # best in ~/.zshrc
zmv '**/*(#qD.)' '$(md5sum<$f)'
すべての一般ファイルの名前は再帰的に変更されます。
(同じディレクトリにある2つのファイルのチェックサムが同じ場合は、ファイルの名前変更を拒否するため、上書きするように-f
追加してください。)
**/*(#qD.)
glob 修飾子が is の再帰 glob zsh
(明示的な形式は(#q<qualifiers>)
、D
隠しファイルを含む、.
選択のみ可能)定期的な文書。
答え3
大きな打撃:
md5sum my.file.here | { read sum filename; mv $filename $sum; }