फ़ाइल नाम खोजें जिसमें एक निर्दिष्ट स्ट्रिंग नहीं है


19

मैं इसके विपरीत निष्पादित करना चाहता हूं:

find . -name "*2013*"

वर्तमान निर्देशिका की सभी फाइलें खोजें जिनके नाम में स्ट्रिंग "2013" नहीं है। मैं उसे कैसे कर सकता हूँ?

जवाबों:


28

सीधे शब्दों में:

find . ! -name '*2013*'

अन्य प्रकार की फ़ाइलों (निर्देशिकाओं, फीफोर्स, सिम्लिंक, डिवाइसेस, सॉकेट्स ...) को छोड़कर ! -type dटाइप डायरेक्टरी की फाइलों को भी जोड़ें (जैसे .ही), या -type fकेवल नियमित फाइल को शामिल करें ।

हालांकि सावधान रहें कि *0 या अधिक वर्णों के अनुक्रम से मेल खाता है । इसलिए यह उन फ़ाइल नामों की रिपोर्ट कर सकता है जिनमें शामिल हैं 2013यदि 2013पूर्ववर्ती या कुछ ऐसा है जो वर्तमान स्थान में मान्य वर्णों के रूप में पूरी तरह से डिकोड नहीं किया जा सकता है।

ऐसा तब हो सकता है जब आप किसी ऐसे स्थान पर हों, जहाँ वर्ण एक से अधिक बाइट (जैसे UTF-8) में फ़ाइल नाम के लिए एन्कोड किए जा सकते हैं जो एक अलग एन्कोडिंग में एन्कोडेड हैं। उदाहरण के लिए, UTF-8 लोकेल में, Stéphane2013अगर यह éiso8859-15 वर्ण सेट (0xe9 बाइट के रूप में) में एन्कोड किया गया था , तो यह एक फ़ाइल की रिपोर्ट करेगा ।

सर्वश्रेष्ठ यह सुनिश्चित करने के लिए होगा कि फ़ाइल नाम लोकेल के वर्ण सेट में एन्कोड किए गए हों, लेकिन यदि आप इसकी गारंटी नहीं दे सकते, findतो सी लोकेले में चारों ओर एक काम चलना है:

LC_ALL=C find . ! -name '*2013*'

4

Ksh फ़ाइल नाम पैटर्न पर्याप्त हैं:

# files with 2013
ls -d -- *2013*

# files without 2013
ls -d -- !(*2013*)

संदर्भ

यदि आपका शेल बैश है, तो shopt -s extglobआपको इस पैटर्न का उपयोग करने से पहले चलाने की आवश्यकता है (आप इसे अपने में डाल सकते हैं .bashrc)। यदि आपका शेल zsh है, तो आपको चलाने की आवश्यकता है setopt ksh_glob(आप इसे अपने में डाल सकते हैं .zshrc)। Zsh भी प्रदान करता है ls -d -- ^*2013*, जिसे प्रारंभिक की आवश्यकता होती है setopt extended_glob

आप इन फ़ाइलनामों के साथ क्या कर रहे हैं, lsइसके आधार पर, उपयोग करने के लिए सही आदेश नहीं हो सकता है। एक सरणी में उन्हें स्टोर करने के लिए

filenames=( !(*2013*) )
for f in "${filenames[@]}"; do ...; done

4
यह उपनिर्देशिकाओं में पुनरावृत्ति नहीं करता है और हालांकि डॉट फ़ाइलों को छोड़ देगा (और lsयदि पैटर्न किसी भी फ़ाइल से मेल नहीं खाता है तो एक त्रुटि संदेश लौटाएगा)। यह भी ध्यान दें कि kshसूची को क्रमबद्ध किया जाएगा।
स्टीफन चेज़लस

-1

वर्तमान निर्देशिका की सभी फाइलें खोजें जिनमें एक निश्चित स्ट्रिंग नहीं है, यहां "2013":

find . ! -name "*2013*" -type f

2
यह अनिवार्य रूप से 3 साल पहले से unix.stackexchange.com/a/102614/117549 जैसी ही चीज है , सिवाय इसके कि आपने "-f" जोड़ा है, जो इसका बदतर जवाब देता है।
जेफ स्कालर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.