Việc sử dụng -exec xargs và -print0 là gì?


20

Tôi nghĩ rằng đây là những cách phổ biến để chuyển kết quả của một lệnh sang lệnh tiếp theo, làm đầu vào.

Làm thế nào để ba làm việc? Hoặc một số trang web / URL là gì?

Câu trả lời:


25

Điều đầu tiên cần gõ:

man find

man xargs

Các findlệnh in kết quả đầu ra tiêu chuẩn theo mặc định, vì vậy -printlựa chọn thường không cần thiết, nhưng -print0tách tên tập tin với một (NULL) byte 0 để tên có chứa khoảng trắng hoặc ký tự dòng mới có thể được giải thích một cách chính xác.

Các -exectùy chọn là một cái gì đó bạn có thể sử dụng thay vì xargs - lệnh find thực thi một lệnh cho mỗi mục nó tìm thấy.

Các xargslệnh đọc chuỗi space- hoặc xuống dòng cách nhau (thường là từ tìm lệnh, nhưng họ có thể đến từ bất cứ nơi nào) và thực hiện một số lệnh cho mỗi chuỗi.
Nếu xargs được chạy với tùy chọn -0 , nó sẽ mong đợi các chuỗi được phân tách bằng NULL làm đầu ra bởifind ... -print0

Ưu điểm của xargs là nó có thể nhóm các chuỗi lại với nhau, do đó nó chỉ thực hiện một lệnh một hoặc hai lần thay vì n lần.

Vì vậy, trong cách sử dụng bình thường:

find start_directory -name '*.txt' | xargs ls -l 

find sẽ liệt kê tên tệp và xargs sẽ đưa ra các lệnh như:

ls -l file1.txt file2.txt file3.txt ... fileN.txt

nhanh hơn so với việc bạn tìm lệnh phát hành:

ls -l file1.txt
ls -l file2.txt
ls -l file3.txt
ls -l ...
ls -l fileN.txt

7

Lưu ý rằng xargs không còn cần thiết với các triển khai tìm kiếm hiện tại mà có lẽ tất cả đều hỗ trợ cú pháp POSIX này:

find directory -name '*.txt' -exec ls -l {} + 

đơn giản hơn và nhanh hơn một chút so với biến thể xargs.

find directory -name '*.txt' | xargs ls -l 

xargs sử dụng ít tài nguyên hơn nhiều so với 'find -exec'
Felipe Alvarez

7
Đó là cách khác. Đường ống đến xargs sẽ sử dụng nhiều tài nguyên hơn một chút so với -exec. Bạn có thể bỏ qua dấu kết thúc "+".
jlliagre

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.