2017-12-12 146 views
6

Tôi đang cố gắng đổi tên một số tệp bằng lệnh bash, nhưng tôi không biết cách thêm hoạt động biểu thức/toán số học vào biểu thức regex.Đổi tên tệp bằng cách sử dụng phép toán

Input:

a000.png 
a001.png 
... 

Ouput:

a010.png 
a011.png 
... 

Tôi cố gắng để thêm từ 10 đến tên.

Một số điều tôi đã cố gắng:

rename -n -e 's/a(\d+).png/a$1 + 10.png/' * 
rename -n -e 's/a(\d+).png/a{$1 + 10}.png/' * 
rename -n -e 's/a(\d+).png/a$($1 + 10).png/' * 

Có một cách đơn giản để làm điều này?

+0

Bí quyết ở đây là 'lệnh rename' sử dụng' cú pháp perl', chứ không phải là cú pháp 'bash' vỏ. Tôi không có một nguồn tốt, toàn diện trong tay để xây dựng/thể hiện điều này, nhưng tôi sẽ đính kèm vào câu trả lời của tôi khi tôi làm. –

+0

Tôi do dự liên kết đến một trang web bên ngoài; có rất nhiều hướng dẫn trên mạng (tìm kiếm trên google). Khi bắt đầu, bạn có thể có được một cái nhìn tổng quan về cursory bằng cách sử dụng 'man perlre'. –

Trả lời

5

Điều này cần thực hiện thủ thuật. Nếu bạn không muốn số 0 đứng đầu, bạn có thể xóa sprintf cũng như chuỗi định dạng "%03d". Hơn nữa, nếu các tệp được đổi tên sẽ luôn luôn bắt đầu bằng a, bạn cũng có thể thay thế regex hàng đầu [a-zA-Z]* bằng ký tự chữ a. Cuối cùng, mặc dù trình chỉ định tệp * có thể đầy đủ, tôi khuyên bạn nên sử dụng tiện ích mở rộng làm biện pháp phòng ngừa an toàn bổ sung (ví dụ: *.png).

As always, try it out first using the -n flag to verify the rename is correct.

rename -v 's/([a-zA-Z]*)([0-9]*)/$1.sprintf("%03d",$2+10)/e' * 
+0

Để hoàn thành, có một chuỗi * tương tự * (không trùng lặp) trên [Unix & Linux] (https://unix.stackexchange.com/questions/47006/trying-to-do-arithmetic-in-perl-rename -tool-debian) có thể làm sáng tỏ thêm vấn đề. –

+0

Điều đó có hiệu quả, nhưng nếu tôi có nhiều tệp, tôi gặp phải lỗi này: "a001.png chưa được đổi tên: a011.png đã tồn tại". Tôi đã có thể đổi tên mọi thứ thành "bXXX.png" và sau đó quay lại 'aXXX.png', nhưng có cách nào đơn giản hơn không? Tôi nghĩ rằng sắp xếp các tên theo thứ tự ngược lại sẽ hoạt động "ls | sắp xếp -r | đổi tên ... ", nhưng nó đã không. – klaus

+2

@ klaus - Tôi đã tự hỏi liệu bạn có gặp phải vấn đề đó không ... Giải pháp' ls | sort -r' của bạn để đảo ngược thứ tự _does_ làm việc, nhưng bạn cũng có để loại bỏ '*' từ cuối lệnh 'rename' vì nó chỉ đọc tên tập tin từ STDIN nếu không có tên nào được cung cấp làm đối số –

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