2009-10-19 44 views
11

Tôi đang cố gắng viết lệnh bash sẽ xóa tất cả các tệp phù hợ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 tạo.Shell Scripting: Sử dụng bash với xargs

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

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

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

+0

chéo gửi: http://serverfault.com/questions/76031/shell-scripting-using-find-to-delete-files-matching-a-pattern –

Trả lời

24

Thử sử dụng:

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

Điều này gây ra tìm đến đầu ra một ký tự null sau mỗi tên tập tin và nói với xargs chia tay tên dựa trên ký tự null thay vì khoảng trắng hoặc thẻ khác.

5

Kiểm tra cờ -0 cho xargs; kết hợp với find 's -print0 bạn nên được đặt.

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

Không sử dụng xargs. Tìm thể làm điều đó mà không cần bất kỳ sự giúp đỡ:

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

+3

Đó là luôn luôn tốt để tránh bắt đầu một quá trình bổ sung, đặc biệt là một cái gì đó như thế này, nơi bạn có thể cung cấp một cái gì đó cách quá dài để xargs. Lưu ý rằng 'find' thậm chí có một hành động' delete' mà bạn có thể sử dụng thay cho '-exec ...' - nhưng nó dễ dàng hơn để tùy chỉnh theo cách này. Bạn cũng không cần phải trích dẫn các dấu ngoặc nhọn, trừ khi bạn đang sử dụng một vỏ cũ như tcsh. – Cascabel

+3

Nhưng điều này sẽ khởi chạy một quá trình 'rm' cho mỗi tệp riêng lẻ, thay vì chuyển một số tên tệp thành' rm' như 'xargs', vì vậy nó sẽ chậm hơn. – JaakkoK

+5

@jk: Đó là lý do tại sao các công cụ 'find' mới hơn có' find -exec rm '{}' + ', sẽ thực hiện các đối số giống như' xargs'. – ephemient

4

GNU tìm

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

find . -name vmware-*.log | xargs -i rm -rf {}

0
find -iname pattern 

sử dụng -iname cho tìm kiếm mẫu

0

Để tránh vấn đề không gian trong xargs tôi 'd sử dụng ký tự dòng mới như sep arator với tùy chọn -d:

find . -name vmware-*.log | xargs -d '\n' rm 
Các vấn đề liên quan