Các giải pháp khác trên trang này không được mong muốn nếu bạn có một danh sách dài các tiện ích mở rộng - việc duy trì một chuỗi dài -not -name 'this' -not -name 'that' -not -name 'other'
sẽ rất tẻ nhạt và dễ bị lỗi - hoặc nếu tìm kiếm có lập trình và danh sách các tiện ích mở rộng được xây dựng khi chạy.
Đối với những tình huống đó, một giải pháp phân tách rõ ràng hơn dữ liệu (danh sách các tiện ích mở rộng) và mã (các tham số đến find
) có thể được mong muốn. Đưa ra một cấu trúc thư mục và tập tin trông như thế này:
.
└── a
├── 1.txt
├── 15.xml
├── 8.dll
├── b
│ ├── 16.xml
│ ├── 2.txt
│ ├── 9.dll
│ └── c
│ ├── 10.dll
│ ├── 17.xml
│ └── 3.txt
├── d
│ ├── 11.dll
│ ├── 18.xml
│ ├── 4.txt
│ └── e
│ ├── 12.dll
│ ├── 19.xml
│ └── 5.txt
└── f
├── 13.dll
├── 20.xml
├── 6.txt
└── g
├── 14.dll
├── 21.xml
└── 7.txt
Bạn có thể làm một cái gì đó như thế này:
## data section, list undesired extensions here
declare -a _BADEXT=(xml dll)
## code section, this never changes
BADEXT="$( IFS="|" ; echo "${_BADEXT[*]}" | sed 's/|/\\|/g' )"
find . -type f ! -regex ".*\.\($BADEXT\)"
Kết quả nào trong:
./a/1.txt
./a/b/2.txt
./a/b/c/3.txt
./a/d/4.txt
./a/d/e/5.txt
./a/f/6.txt
./a/f/g/7.txt
Bạn có thể thay đổi danh sách tiện ích mở rộng mà không thay đổi khối mã.
LƯU Ý không hoạt động với OSX gốc find
- thay vào đó hãy sử dụng gnu find.
-not
có thể được thay thế bằng'!'
(Trích dẫn được khuyến nghị). Mặt khác,-name
trường hợp nhạy cảm trong khi-iname
trường hợp không nhạy cảm.