किसी विशेष निर्देशिका की उपनिर्देशिका को कमांड से कैसे खोजें?
मैं उन फ़ाइलों की एक सूची प्राप्त करने की कोशिश कर रहा हूं, जो मैं उन wc -l
सभी की एक शब्द गणना प्राप्त करने के लिए पाइप कर सकता हूं ( wc
सीधे उपयोग नहीं कर रहा हूं ताकि मैं कमांड का उपयोग करने से पहले फ़ाइल सूची को फ़िल्टर कर सकूं)।
मेरी निर्देशिका संरचना कुछ इस प्रकार है:
- folder
- file.php
- file2.html
- file3.php
- folder1
- folder2a
- folder3b
- folder4
- file.php
- file2.php
मैं अपने में कुछ निर्देशिकाओं को बाहर करना चाहता हूं find
, मोटे तौर पर पुस्तकालयों और अन्य सामानों को जो मैंने नहीं बनाया। मैं मैन्युअल रूप से ऐसा कर सकता हूं:
find /var/www/html/ -type f -not -path "/var/www/html/folder/folder1" -not -path "/var/www/html/folder/folder2a"
आदि।
हालाँकि, सभी फ़ोल्डरों को स्पष्ट रूप से निर्दिष्ट करना कष्टप्रद है, और सूची किसी भी बिंदु पर बदल सकती है। मैंने मैच का उपयोग करने /*
और /**
पैटर्न बनाने की कोशिश की है, लेकिन यह भी काम नहीं करता है। क्या मेरी खोज कमांड में इनमें से एक "नहीं" के लिए एक रास्ता है कि मैं किसी विशेष निर्देशिका के सभी उपनिर्देशिकाओं को बाहर कर सकता हूं, लेकिन उस निर्देशिका को खुद से बाहर नहीं कर सकता हूं ? (इसकी फ़ाइलें शामिल हैं, लेकिन इसकी कोई उपनिर्देशिका नहीं है)?
यहाँ एक सहज अनुमान है:
find /var/www/html -not -path '/var/www/html/someotherbadfolder' -type f \( ! -path "/var/www/html/folder" -maxdepth 1 \)
लेकिन find
इस बारे में शिकायत भी करता है :
find: warning: you have specified the -maxdepth option after a non-option argument -not, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.
तो ऐसा लगता maxdepth
है कि एक ऑपरेशन में संयुक्त होने में असमर्थ है।
विशिष्ट उपनिर्देशिकाओं को छोड़कर बहुत सारे प्रश्नोत्तर हैं, लेकिन विशेष रूप से उपनिर्देशिका में कोई उपनिर्देशिका नहीं है।
मैं इसे एक ही डायरेक्टरी में काम करने के लिए प्राप्त करने में सक्षम था -maxdepth 1
, लेकिन समस्या यह है कि यह एक बड़ी कमांड का अपवर्जन हिस्सा है, और जब मैंने पूरा कमांड चलाया तो यह काम नहीं किया। संभावित रूप से, मुझे विशिष्ट उपनिर्देशिकाओं के साथ-साथ कई अन्य विशिष्ट उपनिर्देशिकाओं में किसी भी उपनिर्देशिका को बाहर करने की आवश्यकता हो सकती है।
जवाब
बस खोज के साथ:
find /var/www/html -type f -not -path '/var/www/html/folder/*/*'
मूल उत्तर:
एक हैक grep -v
खोज के उत्पादन पर हो सकता है :
find /var/www/html/ -type f | grep -v "/var/www/html/folder/.*/" | wc -l
मान लें कि आप विशेष रूप से फ़ाइलों की तलाश कर रहे हैं (यानी निर्देशिका नहीं):
find /var/www/html -type f -not -path "/var/www/html/folder/*/*"
ऐसा इसलिए है क्योंकि:
- फ़ाइलों को सीधे
/var/www/html/folder
निर्देशिकाओं में नहीं रखा जाता है ताकि वे-path
खंड से मेल न खाएं । - निर्देशिका सीधे
/var/www/html/folder
मेल नहीं खाते-type f
। - उपनिर्देशिका के तहत आने वाली फाइलों में पथ में
/var/www/html/folder
अतिरिक्त होना/
आवश्यक है, इसलिए वे-path
अभिव्यक्ति से मेल खाते हैं ।