Câu hỏi Loại trừ một thư mục con bằng cách sử dụng tìm


Tôi có cấu trúc thư mục như thế này

data
|___
   |
   abc
    |____incoming
   def
    |____incoming
    |____processed
   123
    |___incoming
   456
    |___incoming
    |___processed

Có một thư mục con đến trong tất cả các thư mục bên trong thư mục Data. Tôi muốn nhận tất cả các tệp từ tất cả các thư mục và thư mục con ngoại trừ các thư mục def / incoming và 456 / incoming. Tôi đã thử với lệnh sau

 find /home/feeds/data -type d \( -name 'def/incoming' -o -name '456/incoming' -o -name arkona \) -prune -o -name '*.*' -print

nhưng nó không hoạt động như mong đợi.

Ravi


76
2017-11-19 19:11


gốc


Đây không phải là lời khuyên tốt, nhưng nó sẽ giúp bạn thoát khỏi rất nhiều tình huống nhanh chóng và bẩn thỉu: grep -v something để loại trừ bất cứ điều gì bạn không muốn - Miquel


Các câu trả lời:


Những công việc này:

find /home/feeds/data -type f -not -path "*def/incoming*" -not -path "*456/incoming*"

Giải trình:

  • find /home/feeds/data: bắt đầu tìm kiếm đệ quy từ đường dẫn được chỉ định
  • -type f: chỉ tìm các tệp
  • -not -path "*def/incoming*": không bao gồm bất cứ điều gì với def/incoming như là một phần của con đường của nó
  • -not -path "*456/incoming*": không bao gồm bất cứ điều gì với 456/incoming như là một phần của con đường của nó

143
2017-11-19 19:22



gặp lỗi "find: bad option -not find: danh sách biến vị ngữ danh sách đường dẫn" - Ravi
@ Ravi là bạn sử dụng bash shell? Tôi chỉ thử nghiệm điều này trên thiết bị đầu cuối của tôi và nó hoạt động cho tôi. Thay vào đó, hãy thử sao chép và dán giải pháp nếu bạn đã sửa đổi tập lệnh của mình. - sampson-chen
Của nó làm việc, nhưng, nó liệt kê các dirs không tập tin trong những dirs. - Ravi
@ Ravi oh, xin lỗi - tôi đã nhầm lẫn những gì bạn đang tìm kiếm. Thay đổi type d đến -type f và nó sẽ tìm thấy các tệp thay vì thư mục (Xem câu trả lời được cập nhật) - sampson-chen
Thật sự cảm ơn. - Ravi


Chỉ vì lợi ích của tài liệu: Bạn có thể phải đào sâu hơn vì có rất nhiều chòm sao tìm kiếm (như tôi đã phải). Nó có thể chỉ ra rằng prune là bạn của bạn trong khi -not -path sẽ không làm những gì bạn mong đợi.

Vì vậy, đây là một ví dụ có giá trị của 15 tìm các ví dụ loại trừ các thư mục:

http://www.theunixschool.com/2012/07/find-command-15-examples-to-exclude.html 

Để liên kết đến câu hỏi ban đầu, ngoại trừ việc cuối cùng đã làm việc cho tôi như thế này:

find . -regex-type posix-extended -regex ".*def/incoming.*|.*456/incoming.*" -prune -o -print 

Sau đó, nếu bạn muốn tìm một tệp và vẫn loại trừ đường dẫn, chỉ cần thêm | grep myFile.txt.

Nó cũng có thể phụ thuộc vào phiên bản tìm kiếm của bạn. Tôi hiểu rồi:

$ find -version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX

5
2017-08-04 07:15





-name chỉ khớp với tên tệp chứ không phải toàn bộ đường dẫn. Bạn muốn sử dụng -path thay vào đó, đối với các phần mà bạn đang cắt tỉa các thư mục như def/incoming.


4
2017-11-19 19:16





find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/"

1
2018-01-17 22:12



Một số giải thích có thể làm cho điều này thành một câu trả lời tốt hơn nhiều. - Cris Luengo
Cảm ơn bạn về đoạn mã này, đoạn mã này có thể cung cấp một số trợ giúp ngắn hạn có giới hạn. Một lời giải thích hợp lý sẽ cải thiện đáng kể giá trị lâu dài của nó bằng cách cho thấy lý do tại sao đây là một giải pháp tốt cho vấn đề, và sẽ hữu ích hơn cho độc giả tương lai với các câu hỏi tương tự khác. Vui lòng chỉnh sửa câu trả lời của bạn để thêm một số giải thích, bao gồm các giả định bạn đã thực hiện - Shawn C.