2011-11-20 15 views
6

bashスクリプトについて助けが必要です。スクリプトは、ディレクトリ内のすべてのファイルのmd5 sum + extensionに名前を変更する必要があります。ファイルの名前をmd5 sum + extension(BASH)に変更してください。

以下のbashスクリプトが見つかりましたが、拡張機能を追加するように変更する必要があります。

md5sum * | sed 's/^\(\w*\)\s*\(.*\)/\2 \1/' | while read LINE; do mv $LINE; done 

答えて

12

これはあなたのために働くかもしれない:

# mkdir temp && cd temp && touch file.{a..e} 
# ls 
file.a file.b file.c file.d file.e 
# md5sum * | sed -e 's/\([^ ]*\) \(.*\(\..*\)\)$/mv -v \2 \1\3/' | sh 
`file.a' -> `d41d8cd98f00b204e9800998ecf8427e.a' 
`file.b' -> `d41d8cd98f00b204e9800998ecf8427e.b' 
`file.c' -> `d41d8cd98f00b204e9800998ecf8427e.c' 
`file.d' -> `d41d8cd98f00b204e9800998ecf8427e.d' 
`file.e' -> `d41d8cd98f00b204e9800998ecf8427e.e' 

またはGNU SEDはそれをさらに短く操作を行うことができます。

# md5sum * | sed -e 's/\([^ ]*\) \(.*\(\..*\)\)$/mv -v \2 \1\3/e' 
+2

Apple/OSXのバージョンは 'md5 * | $ \ mv -v "\ 1 \ 2" \ 3 \ 2 sed -eの/ MD5(\([^] * \)\(。[^)] * \))/'| sh – fnl

10

私はこのルートを行くだろう:

for F in $DIR/*.*; do 
    mv "$F" "$(md5sum "$F" | cut -d' ' -f1).${F##*.}"; 
done 

使用${F#*.}最初の期間の後にすべてを取得するために、例えば代わりに、このようなgz(あなたの要件によって異なります)

+0

OSX: 'Fのための$ DIRで/*.*。 mv "$ F" "$(md5" $ F "| cut -d" -f4)$ {F ## *。} "; done' –

0
find . -type f -exec mv \{\} "`md5sum \{\} | sed 's/ .*//'`.`echo \{\} | awk -v FS='.' '{print $NF}'\" 

か何かのtar.gzは:-)を行います。実際には、名前に.のないファイルで失敗するので、findコマンドのファイル名にフィルタを追加することをお勧めします。

HTH

関連する問題