Làm cách nào để loại trừ các thư mục con của một thư mục cụ thể khỏi lệnh find?

Aug 15 2020

Tôi đang cố gắng lấy danh sách các tệp mà tôi có thể truy cập wc -lđể có số lượng từ của tất cả chúng (không sử dụng wctrực tiếp để tôi có thể lọc danh sách tệp trước khi sử dụng lệnh).

Cấu trúc thư mục của tôi giống như sau:

- folder
   - file.php
   - file2.html
   - file3.php
   - folder1
   - folder2a
   - folder3b
   - folder4
- file.php
- file2.php

Tôi muốn loại trừ một số thư mục nhất định trong findthư viện phần lớn của tôi và những thứ khác mà tôi không tạo. Tôi có thể làm điều đó theo cách thủ công như vậy:

find /var/www/html/ -type f -not -path "/var/www/html/folder/folder1" -not -path "/var/www/html/folder/folder2a" Vân vân.

Tuy nhiên, thật khó chịu khi phải chỉ định rõ ràng tất cả các thư mục và danh sách cũng có thể thay đổi bất cứ lúc nào. Tôi đã thử sử dụng /*/**để khớp mẫu nhưng điều đó cũng không hoạt động. Có cách nào để một trong những "không phải" này trong lệnh find của tôi mà tôi có thể loại trừ tất cả các thư mục con của một thư mục cụ thể, nhưng không loại trừ chính thư mục đó không? (bao gồm các tệp của nó, nhưng không bao gồm bất kỳ thư mục con nào của nó)?

Đây là một phỏng đoán trực quan:

find /var/www/html -not -path '/var/www/html/someotherbadfolder' -type f \( ! -path "/var/www/html/folder" -maxdepth 1 \)

Nhưng thậm chí còn findphàn nàn về điều này:

find: warning: you have specified the -maxdepth option after a non-option argument -not, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it).  Please specify options before other arguments.

Vì vậy, nó dường như maxdepthkhông có khả năng được kết hợp trong một hoạt động.

Có rất nhiều câu hỏi và giải đáp về việc loại trừ các thư mục con cụ thể, nhưng không nói chung là bất kỳ thư mục con nào trong một thư mục con cụ thể.

Tôi đã có thể làm cho nó hoạt động trong một thư mục duy nhất với -maxdepth 1, nhưng vấn đề là đây là một phần loại trừ của một lệnh lớn hơn và điều đó không hoạt động khi tôi chạy toàn bộ lệnh. Về khả năng, tôi có thể cần phải loại trừ các thư mục con cụ thể cũng như bất kỳ thư mục con nào trong một số thư mục con cụ thể khác.

Trả lời

jeremysprofile Aug 16 2020 at 01:10

Chỉ với tìm:

find /var/www/html -type f -not -path '/var/www/html/folder/*/*'

Câu trả lời ban đầu:

Một lần hack có thể grep -vnằm ở đầu ra của tìm kiếm:

find /var/www/html/ -type f | grep -v "/var/www/html/folder/.*/" | wc -l
2 root Aug 16 2020 at 01:13

Giả sử bạn đang tìm kiếm cụ thể các tệp (tức là không phải thư mục):

find /var/www/html -type f -not -path "/var/www/html/folder/*/*"

Đó là bởi vì:

  • các tệp trực tiếp dưới /var/www/html/folderkhông phải là thư mục nên chúng không khớp với -pathmệnh đề.
  • thư mục trực tiếp dưới /var/www/html/folderkhông phù hợp -type f.
  • các tệp trong thư mục con của /var/www/html/folderphải có phần bổ sung /trong đường dẫn, để chúng khớp với -pathbiểu thức.