Làm cách nào để đổi tên nhiều tệp bằng cách xóa một ký tự hoặc chuỗi?


21

Theo dõi câu hỏi trước đây của tôi , nếu tôi có nhiều tệp có dạng

sw.ras.001
sw.ras.002
sw.ras.003
…

Tôi có thể sử dụng lệnh nào để loại bỏ ras.phần giữa của tất cả các tệp?


Bạn có muốn loại bỏ chỉ các ras, tức là kết thúc với sw..001, hoặc ras., để lại sw.001?
Kevin

Tôi có lẽ muốn xóa 'ras.'. lệnh sẽ rất khác nhau?
Paul

Không, chỉ cần bạn bao gồm \.trong các mẫu.
Kevin

Câu trả lời:


35

Bạn có thể làm điều này với một sửa đổi khá nhỏ của một trong hai câu trả lời từ câu hỏi cuối cùng:

rename s/ras\.// sw.ras.*

hoặc là

for file in sw.ras.*; do
    mv "$file" "${file/ras./}"
done

Giải trình:

renamelà một perltập lệnh lấy một perlbiểu thức chính quy và một danh sách các tệp, lần lượt áp dụng biểu thức chính quy cho tên của từng tệp và đổi tên từng tệp thành kết quả của việc áp dụng biểu thức chính quy. Trong trường hợp của chúng tôi, rasđược khớp theo nghĩa đen và \.khớp với nghĩa đen .(như .một mình chỉ ra bất kỳ ký tự nào ngoài dòng mới) và nó thay thế bằng không có gì.

Các forvòng lặp mất tất cả các file bắt đầu bằng sw.ras.(tiêu chuẩn vỏ glob) và vòng qua chúng. ${var/search/replace}tìm kiếm $varcho searchvà thay thế sự xuất hiện đầu tiên với replace, vì vậy ${file/ras./}lợi nhuận $filevới người đầu tiên ras.bị loại bỏ. Do đó, lệnh đổi tên tệp thành cùng tên trừ ras.. Lưu ý rằng với tìm kiếm và thay thế này, .được thực hiện theo nghĩa đen, không phải là một ký tự đặc biệt.


Bạn có thể giải thích câu trả lời của bạn cho người khác học hỏi từ? "S / ras \ .// sw.ras. *" Làm gì? Tôi đoán tôi biết điều đó nhưng tôi muốn chắc chắn, và những người khác cũng có thể học. Tùy chọn thứ hai cùng một cách.
H_7

1
@ H_7 Ý kiến ​​hay, tôi đã thêm một lời giải thích.
Kevin

14

Một tùy chọn khác là sử dụng mmv (Mass MoVe và đổi tên):

mmv '*ras.*' '#1#2'

Đừng quên sử dụng các trích dẫn duy nhất xung quanh các mẫu của bạn, nếu không các ngôi sao sẽ được mở rộng ở cấp độ vỏ.

Tiện ích không phải lúc nào cũng có sẵn nhưng nếu không có, bạn có thể cài đặt nó với:

sudo apt-get install mmv

Xem trang người đàn ông ở đây .


1
Đó là một công cụ tuyệt vời !!!
Christian

5

Trong bất kỳ vỏ POSIX-compliant ( bash, dash, ksh, vv):

for file in sw.ras.[[:digit:]][[:digit:]][[:digit:]]; do
    mv "${file}" "${file/ras\./}"
done

Hoặc với rename:

rename 's/ras\.//' sw.ras.[[:digit:]][[:digit:]][[:digit:]]

1

Gần đây tôi đã phải đổi tên hàng loạt một số tệp mà tôi phải thay thế lần xuất hiện cuối cùng của một nhân vật trong đó nhân vật xảy ra nhiều lần trong tên tệp. Trong trường hợp cụ thể này, tôi đã phải thay thế dấu gạch ngang cuối cùng bằng dấu gạch -dưới _, biến điều này:

some-long-file-name.ext

vào đây:

some-long-file_name.ext

Phải mất một thời gian nhưng điều này cuối cùng đã làm được:

for FILE in *; do mv $FILE ${FILE%-*}_${FILE##*-}; done

Đây:

  • ${i%-*} khớp với sự khởi đầu của tên tệp cho đến lần xuất hiện cuối cùng của dấu gạch ngang -
  • ${file##*-} khớp với phần còn lại của tên tệp sau lần xuất hiện cuối cùng của dấu gạch ngang -
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.