2011-11-20 26 views
6

Tôi cần trợ giúp về tập lệnh bash. Tập lệnh cần đổi tên tất cả các tệp trong một thư mục thành phần mở rộng md5 sum + của nó.Đổi tên tệp thành md5 sum + extension (BASH)

Tôi đã tìm thấy tập lệnh bash bên dưới, nhưng nó cần phải được thay đổi để nó sẽ thêm phần mở rộng.

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

Trả lời

12

Điều này có thể làm việc cho bạn:

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

Hoặc GNU sed có thể làm điều đó thậm chí ngắn hơn:

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

Phiên bản Apple/OSX là: 'md5 * | sed -e 's/MD5 (\ ([^.] * \) \ (. [^)] * \)) = \ (. * \) $/mv -v "\ 1 \ 2" \ 3 \ 2/'| sh' – fnl

10

tôi sẽ đi tuyến đường này:

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

Sử dụng ${F#*.} để có được tất cả mọi thứ sau khi giai đoạn đầu tiên, ví dụ tar.gz thay vì gz (phụ thuộc vào yêu cầu của bạn)

+0

OSX: 'cho F trong $ DIR /*.*; làm mv "$ F" "$ (md5" $ F "| cắt -d '' -f4). $ {F ## *.}"; done' –

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

Hoặc một cái gì đó như thế này sẽ làm :-). Trên thực tế, tôi khuyên bạn nên thêm bộ lọc vào tên tệp cho lệnh tìm vì nó sẽ không thành công trên các tệp không có tên ..

HTH

Các vấn đề liên quan