Dựa trên mẫu, đổi tên tệp hàng loạt trong thiết bị đầu cuối


48

Tôi cần đổi tên như sau:

file_001_loremipsum.png
file_002_dolor.png
file_003_sit.png
file_004_amet.png
file_105_randomness.png

vào

upl_loremipsum.png
upl_dolor.png
upl_sit.png
upl_amet.png
upl_randomness.png

Làm thế nào để tôi thực hiện nó chỉ với một dòng lệnh đầu cuối đơn giản?


1
Một phiên bản python dựa trên regex không an toàn, hoạt động đệ quy trên tất cả các thư mục con: stackoverflow.com/a/39698169/191246
ccpizza

Câu trả lời:


79

Giải pháp cho ví dụ trên, sử dụng đổi tên :

rename -v -n 's/file_\d{1,3}/upl/' file_*.png

Sử dụng:

rename [options] [Perl regex search/replace expression] [files]

Từ man rename:

   -v, --verbose
           Verbose: print names of files successfully renamed.
   -n, --no-act
           No Action: show what files would have been renamed.

đổi tên CÓ THỂ lấy regex làm đối số.

Những gì chúng tôi đang xem xét là nội dung giữa các trích dẫn duy nhất '. Bạn có thể đặt regex cách nhau bởi /.

Công thức: s/(1)/(2)/where (1)= mẫu tìm kiếm và (2)= mẫu thay thế.

Vì vậy, hãy tự làm quen với regex và đổi tên tập tin theo lô mẫu!


14
Tôi biết đây là Ubuntu, nhưng nếu có ai kết thúc ở đây mặc dù họ đang tìm kiếm giải pháp OS X (tôi đã làm), thì renamecó thể dễ dàng cài đặt brew install rename.
Sandstrom

Trong Ubuntu 18.10, --no-actcờ --nonothay thế. Câu trả lời này cũng có thể rõ ràng hơn một chút: [files]đề cập đến một tệp phù hợp với mẫu ban đầu trong thư mục hiện tại mà người ta muốn đổi tên (ví dụ: *khớp với mọi thứ, nhưng chỉ trong thư mục hiện tại).
Patrick Dark

Liên kết của bạn trỏ đến một liên kết khác rename, có định dạng rename from to filevà không hỗ trợ các biểu thức thông thường. Trên thực tế, bản phân phối Linux của tôi (Cent OS 7) có chính xác phiên bản đó.
Alex Che

6

nếu các tệp trong thư mục severals, hãy sử dụng đổi tên sau khi tìm thấy như:

find -iname file_*.png -type f -exec rename -n 's/file_[0-9]{3}(.*\.png)/upl$1/' {} \;

-n sau khi đổi tên là để kiểm tra, hãy xóa nó để tiếp tục! -)

như thế này, bạn liên kết tìm và đổi tên quyền lực.

Cá nhân, tôi đã sử dụng nó để đổi tên tiêu đề nguồn .h thành .hpp

find -iname *.h -type f -exec rename 's/(.*\.)h/$1hpp/' {} \;

Có tài liệu cho -iname, -type-execlá cờ tại manpages.ubuntu.com/manpages/bionic/man1/find.1.html#expression . ( find --helpkhông đặc biệt hữu ích cho lệnh này.) TL; DR: -inamekhớp với trường hợp mẫu ‐ không nhạy cảm; -type fphù hợp với các tập tin thông thường và -execthực hiện một biểu thức cho đến khi nó gặp một ;ký tự (dấu chấm phẩy).
Patrick Dark

5

Điều này có thể được thực hiện với chút phép thuật mở rộng tham số bash!

for f in file_[0-9]*_*; do mv $f upl_${f#file_[0-9]*_}; done

file_[0-9]*_*;- Mẫu đầu tiên được sử dụng để vượt qua tất cả các tệp bắt đầu bằng 'file_anynumber_'
${f#file_[0-9]*_}- Mẫu thứ hai file_[0-9]*_được sử dụng trong mở rộng tham số cho phép bash xóa 'file_anynumber_' khỏi việc xin chuỗi.

Để biết thêm thông tin về Parameter expansion:

man bash

Lưu ý rằng điều này sử dụng các khối, không phải regex, do đó [0-9]*sẽ khớp với một chữ số theo sau bởi bất kỳ chuỗi nào. Có lẽ có một cách tốt hơn để khớp chỉ những con số, nhưng tôi không thể nghĩ ra bất cứ điều gì cô đọng.
wjandrea

Bạn cũng có thể đề xuất một cách để lệnh này hoạt động đệ quy trong tất cả các thư mục con không?
Francesco DM
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.