Có một số cách để làm điều này bao gồm các vòng lặp trong shell script, find và xargs. Cái nào trong số này là tốt nhất, và cái nào là di động nhất?
Có một số cách để làm điều này bao gồm các vòng lặp trong shell script, find và xargs. Cái nào trong số này là tốt nhất, và cái nào là di động nhất?
Câu trả lời:
find . -exec <command> {} \;
đối với thư mục hiện tại là gốc của cây hoặc nói chung:
find <directory> -exec <command> {} \;
-name "*.c"
hoặc ví dụ -type d
cho các thư mục ...
find ... | xargs ...
thành ngữ, nó xử lý các tệp theo lô và điều này thường sẽ nhanh hơn (ít quá trình được đưa ra).
Sử dụng -print0
tùy chọn để tìm và -0
tùy chọn xargs
nếu bạn có tên tệp hoặc thư mục có khoảng trắng:
find {dir} -print0 | xargs -0r {command}
Các -print0
tùy chọn để tìm in ra tên tập tin như một NUL
-separated chứ không phải là khoảng trắng danh sách tách ra, trong khi các -0
tùy chọn để xargs
chỉ thị nó để phá vỡ đầu vào của nó vào NUL
chứ không phải là khoảng trắng. Vì NUL
là một trong những ký tự không được phép trong tên tệp Unix, nên không có cách nào để nó bị nhầm với một phần của tên tệp.
Các -r
tùy chọn là có để xargs
sẽ không cung cấp cho bạn một lỗi nếu nó không có đầu vào.
Nếu tính di động là một vấn đề tôi sẽ tránh xa các cách làm vỏ cụ thể (có rất nhiều người sử dụng nhiều vỏ khác nhau, nhưng nói chung, tìm và xargs là những công cụ thực sự cơ bản mà không ai dám thay đổi theo cách triệt để) .
Sử dụng các đối số cơ bản của find và xargs sẽ cung cấp cho bạn một giải pháp di động hơn.
Nếu việc nhóm các đối số lại với nhau được chấp nhận, hãy tìm | xargs có thể sẽ cho hiệu năng tốt hơn, vì nó sẽ thực thi lệnh ít hơn rất nhiều lần so với find -exec. Nếu bạn muốn thực thi lệnh mỗi lần cho mỗi tệp hoặc thực thi trong thư mục con của tệp, có lẽ bạn nên sử dụng find -exec hoặc -execdir.
Theo quy định, tốt nhất là tránh xa các vòng lặp cụ thể; find & xargs là đủ cho hầu hết các kịch bản.
Đảm bảo rằng phiên bản lệnh bạn đang sử dụng không có cờ cho hoạt động đệ quy. :)