一部のファイルの名前をその内容のMD5合計に変更したいと思います。たとえば、ファイルfoo
が空の場合は、名前をd41d8cd98f00b204e9800998ecf8427e
に変更する必要があります。
スクリプトである必要がありますか、それともrename
ツールのようなものを使用できますか?
グレンの答えは良いです。複数のファイルの改良点は次のとおりです。
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
を参照して、それらをループに入れることができます。
zsh
の場合:
_autoload zmv # best in ~/.zshrc
zmv '**/*(#qD.)' '$(md5sum<$f)'
_
すべての通常のファイルの名前を再帰的に変更します。
(同じディレクトリ内の2つのファイルのチェックサムが同じである場合、ファイルの名前変更を拒否することに注意してください。それを上書きするには、_-f
_を追加してください)。
**/*(#qD.)
は、グロブ修飾子を使用したzsh
の再帰グロブです(隠しファイルを含めるには_(#q<qualifiers>)
_、D
、選択のみを行うには_.
_などの明示的な形式で通常ファイル。
bash:
md5sum my.file.here | { read sum filename; mv $filename $sum; }