Cách trích dẫn đối số bằng xargs


15

Giả sử tôi muốn xóa tất cả các tệp trong một thư mục lớn hơn 1 MB.

$ find . -size +1M | xargs -0 rm

Điều này sẽ không xóa các tập tin có không gian trong tên của họ. Vì vậy, tôi muốn nó trích dẫn tất cả các đối số mà nó gửi đến rm. Nếu findcung cấp cho nó Some report.docxnó phải vượt qua "Some report.docx"để rm.

Làm thế nào tôi có thể làm điều đó?


1
Bạn nên đọc mywiki.wooledge.org/UsingFind?highlight=%28xargs%29 trước khi làm bất cứ điều gì với xargs. Cũng như wiki cho thấy, không sử dụng xargsmà không cần đi qua các -print0đến find.
Valentin Bajrami


Sử dụng xargs -d$'\n'để giới hạn dấu phân cách chỉ các dòng mới (chứ không phải dấu cách; điều này sẽ không xử lý dấu ngoặc kép, v.v. đặc biệt - Tôi đã kiểm tra trên hệ thống GNU) - câu trả lời được đưa ra trong stackoverflow.com/a/33528111/94687
imz - Ivan Zakharyaschev

Câu trả lời:


13

Sử dụng đơn giản:

find . -size +1M -delete

Nếu bạn khăng khăng sử dụng xargsrmvới find, chỉ cần thêm -print0vào lệnh của bạn:

find . -size +1M -print0 | xargs -r0 rm --

Cách khác:

find . -size +1M -execdir rm -- {} +

Từ man find:

-print0
    True; print the full file name on the standard output, followed by a null 
character (instead of the newline character that -print uses). This allows file names 
that contain newlines or other types of white space to be correctly interpreted by 
programs that process the find output. This option corresponds to the -0 option of 
xargs.

2
Điều này giải quyết vấn đề nhưng thực sự trích dẫn các đối số sẽ hữu ích trong các trường hợp khác. Vì vậy, tôi sẽ giữ cho câu trả lời khác. +1 cho một giải pháp đơn giản mặc dù.
Kshitiz Sharma

2
@KshitizSharma Không, bạn không muốn chuyển "Some report.docx"đến rm, trừ khi tên tệp chứa dấu ngoặc kép. Những gì bạn muốn là để vượt qua Some report.docxkhông bị biến dạng rm. Câu trả lời của KasiyA (bây giờ) cho thấy cách chung để làm điều đó với find. [KasiyA: xin lỗi vì ping sai trước đó.]
Gilles 'SO- ngừng trở thành ác quỷ'

@Gilles Đúng. Trong bash tôi thường trích dẫn chuỗi để vượt qua nó không bị biến dạng. Vì vậy, bằng cách trích dẫn những gì tôi muốn nói là gửi tên tệp dưới dạng một đối số duy nhất cho rm thay vì bị tách ra $0$1v.v.
Kshitiz Sharma

Trên OSX tôi làm xargs -0thay vì xargs -r0.
Rolf

8

Lựa chọn -0của xargsphương tiện mà đầu ra từ ống được hiểu như là null chấm dứt các mặt hàng. Trong trường hợp như vậy, bạn cũng cần tạo đầu vào cho đường ống với find ... -print0.


5

Tôi đã có một yêu cầu tương tự và cuối cùng đã sử dụng công -Itắc để có một trình giữ chỗ và tôi đã có thể trích dẫn nó.

find . -size +1M | xargs -I {} rm "{}"
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.