किसी विशेष निर्देशिका की उपनिर्देशिका को कमांड से कैसे खोजें?

Aug 15 2020

मैं उन फ़ाइलों की एक सूची प्राप्त करने की कोशिश कर रहा हूं, जो मैं उन 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, लेकिन समस्या यह है कि यह एक बड़ी कमांड का अपवर्जन हिस्सा है, और जब मैंने पूरा कमांड चलाया तो यह काम नहीं किया। संभावित रूप से, मुझे विशिष्ट उपनिर्देशिकाओं के साथ-साथ कई अन्य विशिष्ट उपनिर्देशिकाओं में किसी भी उपनिर्देशिका को बाहर करने की आवश्यकता हो सकती है।

जवाब

jeremysprofile Aug 16 2020 at 01:10

बस खोज के साथ:

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
2 root Aug 16 2020 at 01:13

मान लें कि आप विशेष रूप से फ़ाइलों की तलाश कर रहे हैं (यानी निर्देशिका नहीं):

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अभिव्यक्ति से मेल खाते हैं ।