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?
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 wc
trự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 find
thư 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 /*
và /**
để 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 find
phà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ư maxdepth
khô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
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 -v
nằm ở đầu ra của tìm kiếm:
find /var/www/html/ -type f | grep -v "/var/www/html/folder/.*/" | wc -l
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/folder
không phải là thư mục nên chúng không khớp với-path
mệnh đề. - thư mục trực tiếp dưới
/var/www/html/folder
không phù hợp-type f
. - các tệp trong thư mục con của
/var/www/html/folder
phải có phần bổ sung/
trong đường dẫn, để chúng khớp với-path
biểu thức.