ठीक है, चलो यूनिक्स दर्शन लागू करते हैं। इस कार्य के घटक क्या हैं?
- पाठ खोज: आपको फ़ाइल में पाठ खोजने के लिए एक उपकरण की आवश्यकता होती है, जैसे कि
grep।
- पुनरावर्ती: आपको निर्देशिका ट्री में फ़ाइलों की तलाश में जाने के लिए एक उपकरण की आवश्यकता होती है, जैसे कि
find।
- अभिलेखागार: आपको उन्हें पढ़ने के लिए एक उपकरण की आवश्यकता है।
अधिकांश यूनिक्स प्रोग्राम फाइलों पर काम करते हैं। तो संग्रह घटकों पर आसानी से संचालित करने के लिए, आपको उन्हें फ़ाइलों के रूप में एक्सेस करने की आवश्यकता है, दूसरे शब्दों में आपको उन्हें निर्देशिकाओं के रूप में एक्सेस करने की आवश्यकता है।
AVFS फाइल सिस्टम प्रस्तुत फाइल सिस्टम जहां हर संग्रह फ़ाइल के एक दृश्य के /path/to/foo.zipएक निर्देशिका के रूप में पहुँचा जा सकता है ~/.avfs/path/to/foo/zip#। AVFS सबसे आम संग्रह फ़ाइल स्वरूपों में केवल पढ़ने के लिए पहुँच प्रदान करता है।
mountavfs
find ~/.avfs"$PWD" \( -name '*.zip' -o -name '*.tar.gz' -o -name '*.tgz' \) \
-exec sh -c '
find "$0#" -name "*.pm" -exec grep "$1" {\} +
' {} 'Test::Version' \;
fusermount -u ~/.avfs # optional
स्पष्टीकरण:
- AVFS फाइलसिस्टम को माउंट करें।
- संग्रह फ़ाइलों के लिए देखें
~/.avfs$PWD, जो वर्तमान निर्देशिका का AVFS दृश्य है।
- प्रत्येक संग्रह के लिए, निर्दिष्ट शेल स्निपेट (खोज के लिए
$0= संग्रह नाम और $1= पैटर्न के साथ) निष्पादित करें ।
$0#संग्रह का निर्देशिका दृश्य है $0।
{\}बजाय {}जरूरत के मामले में बाहरी findविकल्प बहस के {}अंदर -exec ;(कुछ यह करते हैं, कुछ नहीं)।
- वैकल्पिक: आखिरकार AVFS फाइलसिस्टम को अनमाउंट करें।
या zsh ≥4.3 में:
mountavfs
grep 'Test::Version' ~/.avfs$PWD/**/*.(tgz|tar.gz|zip)(e\''
reply=($REPLY\#/**/*.pm(.N))
'\')
स्पष्टीकरण:
~/.avfs$PWD/**/*.(tgz|tar.gz|zip) वर्तमान निर्देशिका और इसके उपनिर्देशिकाओं के AVFS दृश्य में अभिलेखागार से मेल खाता है।
PATTERN(e\''CODE'\')पैटर्न के प्रत्येक मैच के लिए कोड लागू होता है। मिलान की गई फ़ाइल का नाम है $REPLY। replyसरणी सेट करना मैच को नामों की सूची में बदल देता है।
$REPLY\# संग्रह का निर्देशिका दृश्य है।
$REPLY\#/**/*.pm.pmसंग्रह में फ़ाइलों से मेल खाता है ।
Nग्लोब क्वालीफायर पैटर्न बनाता है एक खाली सूची का विस्तार अगर कोई मुकाबला नहीं है।