2009-12-25 17 views
32

thể trùng lặp:
rename multiple files at once in unixĐổi tên tập tin bằng cách sử dụng regex với bash

Tôi muốn đổi tên tất cả các file từ thư mục sử dụng một regex (thêm một tên đến hết tên) và di chuyển đến thư mục khác.

Nó quan điểm của tôi, nó nên được nhìn như thế này:

mv -v ./images/*.png ./test/*test.png 

nhưng nó không hoạt động.

Có ai có thể đề xuất cho tôi giải pháp không?

+1

Về cơ bản giống như nhiều câu hỏi khác - chẳng hạn như SO 1086502 (http://stackoverflow.com/questions/1086502/). Có một người được hỏi hôm qua, ngay cả. –

Trả lời

44

Hãy thử điều này:

for x in *.png;do mv $x test/${x%.png}test.png;done 
+0

đây là những gì nó trả về: cách sử dụng: mv [-f | -i | -n] [-v] mục tiêu nguồn mv [-f | -i | -n] [-v] nguồn ... thư mục – mxg

+0

@mxg: xin lỗi, tôi đã không đưa ra lệnh đúng 100%: bạn cần 'cd images' trước và thêm vào' test/'với' ..' – catwalk

+3

Bạn nên đặt dấu ngoặc kép xung quanh tên biến trong trường hợp có các khoảng trống trong tên tệp: 'for x in * .png; làm mv "$ x" "test/$ {x% .png} test.png"; done' –

48

Nếu bạn đang ở trên một linux, kiểm tra đặc biệt rename lệnh đó sẽ làm việc đó - đổi tên sử dụng biểu thức thông thường.

rename 's/^images\/(.+)/test\/$1.png/s' images/*.png 

Nếu không, hãy viết một chu kỳ bash trong tên tập tin như catwalk suggested.

+4

Nó có thể được gọi là 'prename' trên một số hệ thống. –

+7

ít nhiều để nhớ/loại, cảm ơn! 'rename 's/_20// g' * .mp4' – ptim

+1

Cách tốt nhất, đơn giản nhất để thực hiện. Mặc dù câu trả lời có thể được chỉnh sửa để đưa ra một số ví dụ như memeLab đã làm. – Memke

35
$ for old in ./images*.png; do 
    new=$(echo $old | sed -e 's/\.png$/test.png/') 
    mv -v "$old" "$new" 
    done 
+3

Tôi thích sử dụng sed vì nó cho phép tôi thay thế nó bằng bất cứ thứ gì tôi thích. trong trường hợp của tôi thay thế "% 20" bằng "". Tôi đã sử dụng 'g' ở cuối regex để cho phép: cho cũ trong * .pdf; làm mới = $ (echo $ cũ | sed -e 's/\% 20// g'); mv $ old "$ new"; được thực hiện – Marlon

+1

Cảm ơn! Tôi bắt nguồn từ một lớp 'mv file_20name.mp4 '$ (echo file_20name.mp4 | sed -e' s/_20// g ')'' từ điều này – ptim

+0

đẹp vì điều này cho phép toàn bộ cú pháp sedex sed. Sự kết hợp tuyệt vời của lệnh và nguyên mẫu tốt cho nhiều tập lệnh bash khác. – Paul

5

Tuy nhiên, một giải pháp khác sẽ được một công cụ gọi là "mmv": mmv "./images/*.png" "./test/#1test.png"

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