फ़ाइल नाम यूनिक्स पर विशिष्ट एक्सटेंशन में समाप्त नहीं होता है?


207

क्या एक निर्देशिका पदानुक्रम में सभी फ़ाइलों को पुन: प्राप्त करने का एक सरल तरीका है, जो एक्सटेंशन की सूची में समाप्त नहीं होते हैं? उदाहरण के लिए सभी फाइलें जो * .dll या * .exe नहीं हैं

UNIX / GNU पाते हैं, शक्तिशाली है, ऐसा नहीं लगता है कि कोई excludeमोड है (या मैं इसे याद कर रहा हूं), और मैंने हमेशा उन चीजों को खोजने के लिए नियमित अभिव्यक्ति का उपयोग करना मुश्किल पाया है जो किसी विशेष अभिव्यक्ति से मेल नहीं खाते हैं ।

मैं एक विंडोज़ वातावरण में हूँ ( अधिकांश GNU टूल के GnuWin32 पोर्ट का उपयोग करके ), इसलिए मैं विंडोज़-केवल समाधानों के लिए समान रूप से खुला हूँ।

जवाबों:


343

या इसके बिना (और भागने की आवश्यकता:

find . -not -name "*.exe" -not -name "*.dll"

और निर्देशिकाओं की सूची को भी बाहर करना

find . -not -name "*.exe" -not -name "*.dll" -not -type d

या सकारात्मक तर्क में ;-)

find . -not -name "*.exe" -not -name "*.dll" -type f

6
-notद्वारा प्रतिस्थापित किया जा सकता है '!'(भाव अनुशंसित है)। दूसरी ओर, असंवेदनशील है -nameजबकि -inameमामला असंवेदनशील है।
इवान चौ


8
$ find . -name \*.exe -o -name \*.dll -o -print

पहले दो-नाम विकल्पों में कोई छाप विकल्प नहीं है, इसलिए वे छोड़ दिया। बाकी सब छपा है।


4

आप grep कमांड का उपयोग करके कुछ कर सकते हैं:

find . | grep -v '(dll|exe)$'

-vपर झंडा grepविशेष रूप से मतलब है "चीजें हैं जो लगता है नहीं है इस अभिव्यक्ति से मेल खाते हैं।"


6
grep -v '\' (dll | exe) $ 'उदाहरण के लिए "dexe" नामक फ़ाइल या डायर के विरुद्ध मिलान को रोक देगा
drAlberT

यह केवल विस्तारित रेगेक्सप के साथ काम करता है। मुझे इस काम को करने के लिए ई (या एग्रेप का उपयोग) करना पड़ा।
जोक्टी

2

एक और :-)

$ ls -Exr
कुल 10
-rw-r - r-- 1 द्रव्यमान linuxdumb 47 Dec 23 14:46 test1
-rw-r - r-- 1 लाभांश लिनेक्सडम्ब 0 जनवरी 4 23:40 test4
-rw-r - r-- 1 लाभांश लिनेक्सडम्ब 0 जनवरी 4 23:40 test3
-rw-r - r-- 1 लाभांश लिनेक्सडम्ब 0 जनवरी 4 23:40 test2
-rw-r - r-- 1 लाभांश लाइनक्सडंब 0 जनवरी 4 23:41 file5
-rw-r - r-- 1 लाभांश लिनेक्सडम्ब 0 जनवरी 4 23:41 file4
-rw-r - r-- 1 लाभांश linuxdumb 0 जनवरी 4 23:41 file3
-rw-r - r-- 1 लाभांश लाइनक्सडंब 0 जनवरी 4 23:41 file2
-rw-r - r-- 1 लाभांश लाइनक्सडंब 0 जनवरी 4 23:41 file1
$ मिल गया। -प्रकार f! -नाम "* 1"! -नाम "* 2" -प्रिंट
./test3
./test4
./file3
./file4
./file5
$

यूनिक्स कमांड संदर्भ पाते हैं



1

लिनक्स / ओएस एक्स:

वर्तमान निर्देशिका से शुरू होकर, .dll या .exe में समाप्त होने वाली सभी फ़ाइलों को पुन: प्राप्त करें

find . -type f | grep -P "\.dll$|\.exe$"

वर्तमान निर्देशिका से शुरू, पुनरावर्ती सभी फ़ाइलों को ढूँढता है जो Dd't में या। Dll में समाप्त नहीं होती हैं

find . -type f | grep -vP "\.dll$|\.exe$"

टिप्पणियाँ:

(1) grep में P विकल्प इंगित करता है कि हम grep कमांड के साथ संयोजन में उपयोग किए जाने के लिए अपने नियमित अभिव्यक्ति लिखने के लिए पर्ल शैली का उपयोग कर रहे हैं । नियमित भावों के साथ grep कमांड को एक्ससेक्ट करने के उद्देश्य से , मुझे लगता है कि पर्ल स्टाइल सबसे शक्तिशाली है।

(2) grep में v विकल्प शेल को निर्देश देता है कि वह ऐसी किसी भी फ़ाइल को बाहर करे जो नियमित अभिव्यक्ति को संतुष्ट करती हो

(3) "डॉल $" कहने के अंत में $ चरित्र एक सीमांकक नियंत्रण चरित्र है जो शेल को बताता है कि फ़ाइल नाम स्ट्रिंग "। Dll" के साथ समाप्त होता है।


0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.