Cách tốt nhất để chạy một lệnh trên mỗi tệp trong cây thư mục


13

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:


13
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> {} \;

4
trên một số hệ thống tìm thấy không có tùy chọn -exec ở đó bạn có thể sử dụng find. | xargs <Command>
Hemant

4
Thật vậy, và nếu bạn cần lọc theo thứ gì đó, hãy thử -name "*.c"hoặc ví dụ -type dcho các thư mục ...

Tìm có thể làm những điều phức tạp đáng ngạc nhiên - bạn có thể muốn kiểm tra trang man - unixhelp.ed.ac.uk/CGI/man-cgi?find - để biết danh sách tùy chọn đầy đủ.
Lucas Jones

Bạn cũng có thể muốn coi chừng tên tệp có khoảng trắng, có thể phá vỡ cách tiếp cận -exec và xargs. Xem tinyurl.com/ygvgmw5
Shawn Chin

Nếu có thể, hãy sử dụng 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).
vonbrand

5

Sử dụng -print0tùy chọn để tìm và -0tùy chọn xargsnế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 -print0tù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 -0tùy chọn để xargschỉ thị nó để phá vỡ đầu vào của nó vào NULchứ không phải là khoảng trắng. Vì NULlà 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 -rtùy chọn là có để xargssẽ không cung cấp cho bạn một lỗi nếu nó không có đầu vào.


3

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.


2

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.


1

Đả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. :)


0
find [args] -print | xargs {command}

Hoạt động tốt nhất cho tôi.


2
-1 Không hoạt động cho tên tệp chứa khoảng trắng. Sử dụng tốt hơn find -print0 | xargs -0.
starblue
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.