Câu trả lời:
Chênh lệch tốc độ sẽ không đáng kể.
Nhưng bạn phải đảm bảo rằng:
Tập lệnh của bạn sẽ không cho rằng không có tệp nào có khoảng trắng, tab, v.v. trong tên tệp; phiên bản đầu tiên là an toàn, phiên bản thứ hai thì không.
Tập lệnh của bạn sẽ không coi tệp bắt đầu bằng " -
" là một tùy chọn.
Vì vậy, mã của bạn sẽ giống như sau:
find . -exec cmd -option1 -option2 -- {} +
hoặc là
find . -print0 | xargs -0 cmd -option1 -option2 --
Phiên bản đầu tiên ngắn hơn và dễ viết hơn vì bạn có thể bỏ qua phiên bản 1, nhưng phiên bản thứ hai mang tính di động và an toàn hơn, vì " -exec cmd {} +
" là một tùy chọn tương đối mới trong GNU findutils (kể từ năm 2005, rất nhiều hệ thống đang chạy sẽ chưa có) và nó đã bị lỗi gần đây . Cũng có nhiều người không biết điều này " -exec cmd {} +
", như bạn có thể thấy từ các câu trả lời khác.
exec
sẽ xuất ra kết quả khi chúng được tìm thấy, xargs
có vẻ như, sẽ đợi cho đến khi toàn bộ thư mục được tìm kiếm trước khi ghi vào stdout. Nếu bạn đang thử điều này trên một thư mục lớn và có vẻ như xargs
không hiệu quả, bạn nên kiên nhẫn.
-print0
find trả về các tên tệp được phân tách bằng dòng mới, nhưng dòng mới cũng có thể là một phần của tên tệp, khiến nó trở nên mơ hồ. Byte 0 không thể, vì vậy nó là một dấu phân cách an toàn. Có - thêm --
vào một lệnh hỗ trợ nó là một thực tiễn tốt khi bạn không thể kiểm soát các đối số của nó, ngay cả khi không phải lúc nào cũng được yêu cầu nghiêm ngặt hoặc không an toàn.
find . | xargs cmd
hiệu quả hơn (nó chạy cmd
ít lần nhất có thể, không giống như exec
chạy cmd
một lần cho mỗi trận đấu). Tuy nhiên, bạn sẽ gặp rắc rối nếu tên tệp chứa khoảng trắng hoặc ký tự vui nhộn.
Những điều sau đây được đề xuất sử dụng:
find . -print0 | xargs -0 cmd
điều này sẽ làm việc ngay cả khi tên tập tin chứa các ký tự funky ( -print0
làm cho find
in trận NUL-chấm dứt, -0
làm cho xargs
hy vọng định dạng này.)
xargs
phương pháp này thực sự chậm hơn đáng kể nếu không có (hoặc chỉ một vài) tệp phù hợp và cmd
không có nhiều việc phải làm cho mỗi tệp. Ví dụ: khi chạy trong một thư mục trống, xargs
phiên bản sẽ mất ít nhất gấp đôi thời gian, vì phải khởi động hai quá trình thay vì chỉ một. (Vâng, sự khác biệt là thường không thể nhận thấy trên * nix, nhưng trong một vòng lặp nó có thể là quan trọng; hoặc, hãy thử nó trên Windows một thời gian ...)