अनिवार्य रूप से 2 विधियां हैं जो आप ऐसा करने के लिए उपयोग कर सकते हैं। एक स्ट्रिंग को पार्स करेगा जबकि दूसरा प्रत्येक फ़ाइल पर काम करेगा। स्ट्रिंग को पार्स करने से उपकरण का उपयोग होता है grep
, जैसे sed
, या awk
स्पष्ट रूप से तेज़ होने वाला है , लेकिन यहां एक उदाहरण दोनों को दिखा रहा है, साथ ही साथ आप 2 तरीकों को "प्रोफ़ाइल" कैसे कर सकते हैं।
नमूना डेटा
नीचे दिए गए उदाहरणों के लिए हम निम्नलिखित डेटा का उपयोग करेंगे
$ touch dir{1..3}/dir{100..112}/file{1..5}
$ touch dir{1..3}/dir{100..112}/nile{1..5}
$ touch dir{1..3}/dir{100..112}/knife{1..5}
इनमें से कुछ *f*
फ़ाइलें हटाएं dir1/*
:
$ rm dir1/dir10{0..2}/*f*
# 1 दृष्टिकोण - तार के माध्यम से पार्स करना
यहाँ हम निम्नलिखित उपकरणों का उपयोग करने, जा रहे हैं find
, grep
और sort
।
$ find . -type f -name '*f*' | grep -o "\(.*\)/" | sort -u | head -5
./dir1/dir103/
./dir1/dir104/
./dir1/dir105/
./dir1/dir106/
./dir1/dir107/
# 2 दृष्टिकोण - फ़ाइलों का उपयोग करके पार्स करना
पहले की तरह समान उपकरण श्रृंखला, इस समय को छोड़कर हम dirname
इसके बजाय का उपयोग करेंगे grep
।
$ find . -type f -name '*f*' -exec dirname {} \; | sort -u | head -5
./dir1/dir103
./dir1/dir104
./dir1/dir105
./dir1/dir106
./dir1/dir107
नोट: उपरोक्त उदाहरण head -5
केवल इन उदाहरणों के साथ काम कर रहे आउटपुट की मात्रा को सीमित करने के लिए उपयोग कर रहे हैं। वे आपकी पूरी सूची प्राप्त करने के लिए सामान्य रूप से हटा दिए जाएंगे!
परिणामों की तुलना करना
हम time
2 दृष्टिकोणों पर एक नज़र डालने के लिए उपयोग कर सकते हैं ।
dirname
real 0m0.372s
user 0m0.028s
sys 0m0.106s
ग्रेप
real 0m0.012s
user 0m0.009s
sys 0m0.007s
इसलिए यदि संभव हो तो स्ट्रिंग्स से निपटने के लिए हमेशा सबसे अच्छा है।
वैकल्पिक स्ट्रिंग पार्सिंग विधियाँ
grep और PCRE
$ find . -type f -name '*f*' | grep -oP '^.*(?=/)' | sort -u
sed
$ find . -type f -name '*f*' | sed 's#/[^/]*$##' | sort -u
awk
$ find . -type f -name '*f*' | awk -F'/[^/]*$' '{print $1}' | sort -u
uniq
मिश्रण में फेंकने से बार-बार एक दूसरे के बगल में पहले से मौजूद लाइनों को हटाकर बहुत मदद मिलती है।find . -type f -name '*f*' -printf '%h\0' | uniq -z | sort -zu | tr '\0' '\n'
। या यदि आपके उपकरण थोड़े पुराने हैं, तो uniq में -z विकल्प नहीं हो सकता है।find . -type f -name '*f*' -printf '%h\n' | uniq | sort -u