Làm cách nào để xóa nhiều tệp có tiền tố và hậu tố chung?


21

Tôi có nhiều tập tin tên

sequence_1_0001.jpg  
sequence_1_0002.jpg  
sequence_1_0003.jpg  
...

và các tập tin có tên

sequence_1_0001.hmf  
sequence_1_0002.hmf  
sequence_1_0003.hmf  
...

và các tập tin có tên

sequence_2_0001.jpg  
sequence_2_0002.jpg  
sequence_2_0003.jpg  
...

sequence_2_0001.hmf  
sequence_2_0002.hmf  
sequence_2_0003.hmf  
...

Tôi chỉ muốn xóa các tệp bắt đầu bằng 'sequ_1' và kết thúc bằng '.hmf', nhưng tôi không muốn xóa từng tệp một, vì có hàng ngàn tệp. Làm cách nào tôi có thể chỉ định cho lệnh rm mà tôi muốn xóa tất cả bắt đầu bằng prefilx 'Sequ_1' và kết thúc bằng '.hmf'?

Tôi hiện đang làm việc với hệ thống RedHat Linux, nhưng tôi cũng muốn biết cách thực hiện trên các bản phân phối khác.

Câu trả lời:


28
rm sequence_1*.hmf

loại bỏ các tập tin bắt đầu bằng sequence_1và kết thúc bằng .hmf.


Globbing là quá trình trong đó trình bao của bạn lấy một mẫu và mở rộng nó thành một danh sách các tên tệp khớp với mẫu đó. Đừng nhầm lẫn nó với các biểu thức thông thường, đó là khác nhau. Nếu bạn dành phần lớn thời gian của mình bash, Wooledge Wiki có một trang tốt về Globing (mở rộng tên đường dẫn) . Nếu bạn muốn tính di động tối đa, bạn cũng sẽ muốn đọc thông số POSIX về khớp mẫu / thay vào đó.


Trong trường hợp không chắc là bạn gặp phải lỗi "Danh sách đối số quá dài" , bạn có thể xem BashFAQ 95 , giải quyết vấn đề này. Cách giải quyết đơn giản nhất là chia mẫu hình cầu thành nhiều phần nhỏ hơn, cho đến khi lỗi biến mất. Trong trường hợp của bạn, có lẽ bạn có thể thoát khỏi việc tách trận đấu bằng các chữ số tiền tố từ 0 đến 9, như sau:

for c in {0..9}; do rm sequence_1_"$c"*.hmf; done
rm sequence_1*.hmf  # catch-all case

Đây là một công việc rất thông minh xung quanh lỗi 'danh sách đối số quá dài'. Trong trường hợp của tôi, tôi có hai mươi nghìn tệp, vì vậy tôi đoán tôi sẽ phải sử dụng vòng lặp for từ 0, .., 20. Đúng?
Paul

@Paul Đúng, chỉ cần chia danh sách thành nhiều phần bạn cần, mặc dù tại một số điểm, findcách tiếp cận trở nên dễ dàng hơn so với đoán và kiểm tra.
jw013

14

Mặc dù câu trả lời của jw013 là chính xác, nhưng lệnh đó có thể thất bại nếu bạn có hàng ngàn kết quả khớp: dòng lệnh mở rộng rm sequence_1_0001.hmf sequence_1_0002.hmf ...được tạo bởi shell có thể đơn giản là quá lớn.

Như Dom đề xuất, bạn cũng có thể sử dụng -deletetùy chọn với find:

find . -maxdepth 1 -type f -name 'sequence_1*.hmf' -delete

Cả -maxdepth-delete, trong khi không có trong tiêu chuẩn POSIX là khá phổ biến trong findviệc triển khai trong tự nhiên. Các bản phân phối Linux thường sử dụng GNU find, chắc chắn hỗ trợ các tùy chọn đó.


2
Nếu bạn có thể, hãy sử dụng tùy chọn -delete để tìm, nó không rẽ nhánh cho mỗi tệp ...
Dom

Đã thêm, chúc mừng. Có vẻ như -deletenên được hỗ trợ trên các hệ thống GNU BSD gần đây , trong khi -print0chỉ dành cho GNU. Vì vậy, nó cũng có khả năng di động nhiều hơn (mặc dù nó không tạo ra sự khác biệt cho OP).
Vô dụng

Ít nhất là tìm thấy của OS X có -print0, nhưng nó không được bao gồm trong POSIX.
Lri

5
rm sequence_1_{0000..0999}.hmf
rm sequence_1_{1000..1999}.hmf
rm sequence_1_{2000..2999}.hmf
...

cũng sẽ làm việc ở Bash.


Việc mở rộng niềng răng đòi hỏi bash, và hình thức đệm không cần phiên bản 4, tôi tin.
jw013
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.