Tìm tập tin trong linux và loại trừ các thư mục cụ thể


14

Tôi có một tìm kiếm như thế này:

rm -f crush-all.js
find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | while read line
do
   cat "$line" >> crush-all.js
   echo >> crush-all.js
done

Tôi muốn thêm để loại trừ một thư mục có tên "test" trong tìm kiếm nhưng dường như tôi không thể tìm ra cách thêm "-type d" bằng cách nào đó. Làm thế nào tôi đi về làm điều đó?

Cảm ơn!

Câu trả lời:


22

Bạn có thể sử dụng -pathtùy chọn để tìm và kết hợp nó với -nottoán tử.

find . ! -path "*/test/*" -type f -name "*.js" ! -name "*-min-*" ! -name "*console*"

Xin lưu ý hai điều

  • -path phải đến như là đối số đầu tiên
  • mẫu khớp với toàn bộ tên tệp, vì vậy -path testsẽ không khớp với bất cứ thứ gì

Nhân tiện, tôi không chắc tại sao bạn lại sử dụng dấu ngoặc đơn, nó không tạo ra sự khác biệt. Nó chỉ được sử dụng cho quyền ưu tiên, cho các cấu trúc như ! \( -name '*bla*' -name '*foo*' \)(nghĩa là không tìm thấy những thứ có cả hai blafoo).

Một sàng lọc thêm: không cần sử dụng vòng lặp bash, bạn chỉ cần làm

find . ... -exec cat {} \; -exec echo \;

trong đó ... là những đối số khác find.


2
find / -path ./test -prune -o ...

Đổi tên ./testcho phù hợp với vị trí của thư mục kiểm tra của bạn.


2
Trong trường hợp này, đừng quên hành động thêm dấu (vì -print không phải là hành động mặc định) sau tùy chọn -o
Bill Zhao

1

Bạn có thể thử với grep như thế này (thư mục ở đây có tên test_folder):

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/path/to/test_folder/" | while read line

hoặc nếu tìm thấy của bạn trả về đường dẫn tương đối:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "./relative_path/to/test_folder/" | while read line

hoặc nếu bạn muốn tất cả các thư mục có cùng tên nhưng có đường dẫn khác nhau

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/test_folder/" | while read line

Trân trọng,


1

Để mở rộng những gì tôi nghĩ @CharlesClavadetscherlà sẽ có câu trả lời của anh ấy. Nếu bạn bỏ qua một đường dẫn với -not -path ... findsẽ tiếp tục đi xuống đường dẫn. Thay vào đó, việc sử dụng -prunesẽ ngăn không cho nó đi sâu hơn vào con đường bị bỏ qua, làm cho nó nhanh hơn. Vì vậy, bạn có thể làm một cái gì đó như

find . -path '*test/*' -prune -o -type f -name "*.js" ! -name "*-min*" ! -name "*console*" -print

0

Tôi sử dụng "không wholename" khi tôi chỉ tìm kiếm một tập tin. -name kiểm tra tên tệp thực tế, nhưng -wholename kiểm tra đường dẫn đầy đủ. Vì vậy, thêm một bỏ qua để kiểm tra cho câu hỏi trên:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) ! -wholename "*test*"
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.