Làm thế nào để sử dụng lệnh find để xóa các tệp khớp với một mẫu?


17

Tôi đang cố gắng viết một lệnh bash sẽ xóa tất cả các tệp khớp với một mẫu cụ thể - trong trường hợp này, đó là tất cả các tệp nhật ký vmware cũ đã được xây dựng.

Tôi đã thử lệnh này:

find . -name vmware-*.log | xargs rm

Tuy nhiên, khi tôi chạy lệnh, nó sẽ chặn tất cả các thư mục có khoảng trắng trong tên của chúng. Có cách nào để định dạng đường dẫn tệp để xargs chuyển nó đến rm được trích dẫn hoặc thoát đúng không?


Câu trả lời:


20

Tôi thường thấy rằng sử dụng -exectùy chọn findđể dễ dàng hơn và ít nhầm lẫn hơn. Thử đi:

find . -name vmware-*.log -exec rm -i {} \;

Tất cả mọi thứ sau đó -execđược coi là một lệnh để chạy cho mỗi kết quả, cho đến ;, được thoát ra ở đây để nó sẽ được chuyển đến find. Tên {}được thay thế bằng tên tệp findthường in.

Khi bạn đã xác minh nó làm những gì bạn muốn, bạn có thể xóa -i.


1
Ngoài ra, nếu đó chỉ là các tệp bạn muốn xóa và không phải thư mục, bạn có thể thêm '' -type f '' vào lệnh find.
JamesHannah

18

Nếu bạn có GNU, findbạn có thể sử dụng -deletetùy chọn:

find . -name "vmware-*.log" -delete

Để sử dụng xargsvà tránh sự cố với khoảng trắng trong tên tệp:

find . -name vmware-*.log -print0 | xargs -0 rm

Tuy nhiên, tệp nhật ký của bạn không nên có khoảng trắng trong tên của chúng. Tài liệu xử lý văn bản và tệp MP3 có thể có chúng, nhưng bạn sẽ có thể kiểm soát tên của tệp nhật ký của mình.


Thật gọn gàng. Tôi không biết về điều đó.
Jeff Snider

8

Bạn có thể yêu findcầu phân định danh sách đầu ra với NULL và xargsnhận danh sách đầu vào giống như sau:

$ ls -l "file 1" "file 2"
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 2

$ find . -name 'file *' -print0 | xargs -0 ls -l
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 2

$ find . -name 'file *' -print0 | xargs -0 rm -v
removed `./file 2'
removed `./file 1'

Ngoài ra, hãy chắc chắn rằng bạn thoát khỏi *dấu gạch chéo ngược hoặc bằng cách chứa các vmware-*.logdấu ngoặc đơn, nếu không, trình bao của bạn có thể cố gắng mở rộng nó trước khi chuyển đi find.


6

Đừng quên -deletetùy chọn tìm . Nó xóa tệp mà không có lỗi với các ký tự đặc biệt ...

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.