Tìm thư mục con trong tất cả các thư mục có cùng tên


8

Tôi muốn chạy một lệnh để:

  1. Tìm tất cả các thư mục có tên " inc" trong một thư mục " X".
  2. Liệt kê tất cả các thư mục con dưới mỗi " X/.../inc/".
  3. Chuyển hướng đầu ra đến một tệp có tên " list"

Tôi đã thử các kết hợp khác nhau của lệnh dưới đây, nhưng không thành công:

$ find X/ -name "inc" -print | xargs find {} -type d > list
find: path must precede expression

Tôi có thể làm cái này như thế nào?

Câu trả lời:


13

find có thể tự làm tất cả điều này:

find X -path '*/inc/*' -type d > list

Đọc -pathphần man findđể biết thêm.

Như tôi đã đề cập nhanh chóng trong một nhận xét: nếu bạn lưu trữ dòng thư mục được phân tách trong tệp văn bản, tên thư mục chứa dòng mới sẽ không thể biểu thị rõ ràng. Nếu bạn chắc chắn rằng các thư mục không chứa dòng mới, thì không sao. Chỉ là một nhận xét chung.


vâng tôi đã đưa ra câu trả lời tương tự ở đây
Hoàng tử John Wesley

Hoặc tìm danh sách X -name 'inc' -type d>
MaQleod

@MaQleod: Không, đó không phải là câu hỏi.
Daniel Andersson

4

Đây là một lớp lót tiện dụng:

find X -type d -name "inc" -exec sh -c 'find {} -type d' \; > list

Nó chạy findtrên mỗi findkết quả đầu tiên . Các exectùy chọn cũng có thể mất một lệnh shell tối thiểu, trong đó - như tôi đã nói - {}được thay thế với mỗi thư mục của người đầu tiên find.

Thứ hai find, theo yêu cầu của bạn, "liệt kê tất cả các thư mục con" của các kết quả đầu tiên, bao gồm cả incthư mục. Nếu bạn không muốn nó ở đầu ra, hãy để thư mục đầu ra thứ hai find ít nhất ở độ sâu 1.

find X -type d -name "inc" -exec sh -c 'find {} -mindepth 1 -type d' \; > list

Sau đó chúng ta sẽ chuyển hướng lệnh stdoutvào list.


một biến thể cho câu trả lời đó rất hữu ích với tôi khi tôi chỉ muốn độ sâu 1 thư mục con của trận đấu gốc find path -name inc -type d -exec sh -c 'find {} -mindepth 1 -maxdepth 1 -type d' \;
Core

1

Được rồi tôi đã tìm thấy câu trả lời để mô phỏng tìm thấy lồng nhau này:

find X/ -type d | grep "/inc/" > list

Thật tuyệt, điều đó cũng sẽ hiệu quả! Tuy nhiên, trong vỏ Unix / Linux, có thực sự có những điều như các câu trả lời. Đó là một hỗn hợp của sở thích cá nhân và những gì dễ làm theo.
Vishal Kotcherlakota

Để xử lý các tên tệp không theo quy tắc (nhưng hiện có) với các dòng mới: find X/ -type d -print0 | awk 'BEGIN{RS="\0"}/\/inc\//' > list( grep -zcũng phân cách trên ký tự null, nhưng đầu ra của nó dường như cũng bị tách ra, do đó, người ta sẽ cần phải chuyển nó qua ví dụ xargs -0L1 echođể có được từng dòng ). Trong trường hợp này, vì bạn đang lưu danh sách vào tệp với mỗi mục được phân tách bằng dòng mới, dòng mới trong tên tệp sẽ vẫn được trình bày một cách mơ hồ. Có lẽ bạn thậm chí không cần tệp trung gian, tùy thuộc vào những gì bạn muốn làm với danh sách.
Daniel Andersson

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.