โซลูชันอื่น ๆ ในหน้านี้ไม่พึงประสงค์หากคุณมีรายการส่วนขยายที่ยาว - การรักษาลำดับที่ยาวนานของ-not -name 'this' -not -name 'that' -not -name 'other'
จะน่าเบื่อและเกิดข้อผิดพลาดได้ง่ายหรือหากการค้นหาเป็นแบบโปรแกรมและรายการส่วนขยายถูกสร้างขึ้นที่รันไทม์
สำหรับสถานการณ์เหล่านั้นทางออกที่ชัดเจนยิ่งขึ้นในการแยกข้อมูล (รายการส่วนขยาย) และรหัส (พารามิเตอร์ถึงfind
) อาจเป็นที่ต้องการ รับโครงสร้างไดเรกทอรีและไฟล์ที่มีลักษณะเช่นนี้:
.
└── 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
คุณสามารถทำสิ่งนี้:
## 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\)"
ซึ่งผลลัพธ์ใน:
./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
คุณสามารถเปลี่ยนรายการส่วนขยายโดยไม่เปลี่ยนบล็อคโค้ด
หมายเหตุใช้ไม่ได้กับ OSX เนทิฟfind
- ใช้ gnu find แทน
-not
สามารถถูกแทนที่ด้วย'!'
(ขอแนะนำอ้าง) บนมืออื่น ๆ ที่-name
เป็นกรณีในขณะที่มีความสำคัญ-iname
เป็นกรณีตาย