2011-11-20 26 views
6

Bir bash komut dosyasında yardıma ihtiyacım var. Komut dizindeki tüm dosyaların md5 toplamı + uzantısına yeniden adlandırılması gerekir.Dosyaları md5 toplamı + uzantısına yeniden adlandır (BASH)

Aşağıdaki bash komut dosyasını buldum, ancak uzantıyı ekleyebilmesi için değiştirilmesi gerekiyor.

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

cevap

12

Bu sizin için işe yarayabilecek:

# 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' 

Veya GNU sed bile daha kısa yapabilirsiniz:

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

yapıldı Apple/OSX sürümü: 'md5 * | sed-e/MD5 (\ ([^.] * \) \ (. [^)] * \)) = \ (. * \) $/mv -v "\ 1 \ 2" \ 3 \ 2/'| sh' – fnl

10

bu yolu gider: İlk döneminden sonra, örneğin her şeyi elde etmek

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

kullanın ${F#*.}tar.gz yerine gz (ihtiyaçlarınız bağlıdır) böyle

+0

OSX: '$ DIR içinde F /*.*; mv "$ F" "$ (md5" $ F "| cut -d '' -f4) yapın. $ {F ## *.}"; –

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

Ya da bir şey :-) yapacağız. Aslında, adında bir . olmadan dosyalarda başarısız olacağından, find komutunun dosya isimlerine bir filtre eklemeyi öneririm.

HTH