यदि आपके पास एक्सटेंशन की लंबी सूची है - तो इस पृष्ठ पर अन्य समाधान वांछनीय नहीं हैं - एक लंबे अनुक्रम को बनाए रखना -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
मामला असंवेदनशील है।