मैं एक निर्देशिका के अंदर बड़ी संख्या में पीडीएफ फाइलों में वाक्यांशों को खोजने के लिए कमांड लाइन टूल का उपयोग कर रहा हूं। विंडोज एक्सपी में एक्सप्लोरर खोज इसकी अनुमति देता है लेकिन बहुत धीमी है। यहाँ grep युक्तियाँ है?
मैं एक निर्देशिका के अंदर बड़ी संख्या में पीडीएफ फाइलों में वाक्यांशों को खोजने के लिए कमांड लाइन टूल का उपयोग कर रहा हूं। विंडोज एक्सपी में एक्सप्लोरर खोज इसकी अनुमति देता है लेकिन बहुत धीमी है। यहाँ grep युक्तियाँ है?
जवाबों:
SEARCH_DIR = "/ कुछ / dir / जहां / आप / चाहते हैं / करने के लिए / खोज /"; SEARCH_STRING = "जो कुछ में आप कर रहे हैं-खोज";
# पीडीएफ से पाठ निकाल रहा है pdftotext "file.pdf" "file.txt" # grep से जुड़ना pdftotext "file.pdf" / dev / stdout | grep -H --label = "file.pdf" - "$ SEARCH_STRING" # अगर आप चाहते हैं कि grep केवल पीडीएफ फाइल की मिलान सूची दिखायें, तो --files-with-match pdftotext "file.pdf" / dev / stdout | grep -H --label = "file.pdf" --files-with-match - "$ SEARCH_STRING" # खोज करने के लिए पीडीएफ की संभावित सूची खोजें "$ SEARCH_DIR" खोजें- f -name '* .pdf'> सूची-की-pdf.txt
# सब कुछ डक्ट टेप के रूप में awk से जुड़ गया, प्रसंस्करण के लिए बैश भेजा गया # डबल कोट जाग के अंदर x22 के रूप में बच जाता है। "" $ SEARCH_DIR "खोजें-फ़ाइ-फ़ेम '* .pdf' | awk -v SEARCH_STRING =" $ SEARCH_STRING "'{ "pdftotext \ x22" $ 0 "\ x22 / dev / stdout | grep -H --label = \ x22" $ 0 "\" } '| बैश
# बैश के साथ। अपनी जरूरत से मेल खाने के लिए आगे की प्रक्रिया "$ SEARCH_DIR" खोजें-f -name '* .pdf' | awk -v SEARCH_STRING = "$ SEARCH_STRING" ' { EXEC = "pdftotext \ x22" $ 0 "\ x22 / dev / stdout | grep -H --label = \ x22" $ 0 "\ x22 - \ x22" SEARCH_STRING \ "x22"; जबकि (EXEC | गेटलाइन रिट)) { प्रिंट "फ़ाइल के लिए [" $ 0 "] हमारे पास मैच [" रिट "]"; # जो भी तुम्हें पसंद है करो। }; करीब (EXEC); } '
लिनक्स और विंडोज दोनों के तहत, आप एक्रोबैट रीडर का उपयोग कर सकते हैं, जिसमें कई फाइलों को खोजने की आज्ञा है।
लिनक्स के तहत, रिकॉल है, जो आपकी पीडीएफ़ फ़ाइलों (और अधिक) के सूचकांक का निर्माण करेगा, जब आप इसे पहली बार चलाते हैं। इंडेक्स बनने के बाद, शब्द खोज बहुत तेज होनी चाहिए; वाक्यांश खोज वाजिब होनी चाहिए। सुनिश्चित करें कि pdftotext
रिकॉल शुरू करने से पहले कमांड इंस्टॉल किया गया है; डेबियन और उबंटू के तहत, यह poppler-utils
पैकेज में है, मुझे Suse के बारे में नहीं पता।
या आप फ़ाइलों को सीधे पाठ में बदल सकते हैं और नीचे दिए गए आदेशों के साथ पाठ फ़ाइलों पर grep का उपयोग कर सकते हैं।
find -name '* * .pdf' -exec pdftotext {} \; grep -r --include '* .txt' -l -F "सटीक वाक्यांश खोज करने के लिए" grep -r --include '* .txt' -l -E "खोज करने के लिए नियमित अभिव्यक्ति"
pdftotext
( स्टेप जैसे उपकरण स्वचालित रूप से करेंगे)।
Adobe रीडर एक्स काम करता है और यह करता है न केवल एक फ़ाइल के अंदर एक पूरी निर्देशिका और उप निर्देशिकाओं के तहत खोज की अनुमति देते हैं, लेकिन यह एक कमांड लाइन कार्यक्रम नहीं है।
recoll
डेबियन पर हाथ से स्थापित, अब इसे अपने विंडोज़-आधारित कर्मचारियों के लिए उपयोग करने योग्य बनाने की कोशिश कर रहा है।
अपने घर निर्देशिका की उन सभी फाइलों को पुन: सूचीबद्ध करने के लिए जिनमें पीडीएफ फाइल एक्सटेंशन है और जिसमें एक पंक्ति है जो [iI]n Haskell
उदाहरण के लिए 'x ' से मेल खाता है , आप जारी कर सकते हैं:
find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir sh -c 'pdftotext "$0" - | grep -El --label="$PWD${0#?}" "$1"' {} '[iI]n Haskell' \;
टिप्पणियों:
-exec
या xargs
क्योंकि, सुरक्षा कारणों से , मुझे लगता है कि ऐसा करने की आदत में आना अच्छा है। ' -execdir
' से ' -exec
' और ' $PWD${0#?}
' से ' $0
' में बदलना इस उदाहरण में समान परिणाम प्राप्त करना चाहिए।./
') के लिए डिफ़ॉल्ट रूप से उत्सर्जित होता है । इस उदाहरण में, जिन मार्गों के विरुद्ध मिलान किया गया है, वे सभी निरपेक्ष हैं (अर्थात ' /
' से शुरू होते हैं ) क्योंकि ' ~/
' को वर्तमान उपयोगकर्ता के होम डायरेक्टरी के निरपेक्ष पथ में विस्तारित किया जाता है, और यह एकमात्र पथ तर्क है।$0
' और ' $1
' इस तरह से इस्तेमाल किए जाने वाले स्थितिगत मापदंड हैं, जो तर्कों को सही ढंग से उद्धृत करते हैं। यदि यह ठीक से नहीं किया जाता है, तो कमांड मनमाने ढंग से फाइलनामों के लिए असुरक्षित है।${0#?}
' का पहला किरदार $0
यानी ' .
' धारी है।फ़ाइल नाम द्वारा दी गई प्रत्येक मिलान रेखा को प्रिंट करने के लिए:
find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir bash -c 'pdftotext "$0" - | grep -EH --label="${0:2}" "$1"' {} '[iI]n Haskell' \;
यह संस्करण ' -H
' के बजाय ' ' का उपयोग करता है -l
, और फ़ाइलपैथ के बजाय फाइलनाम के साथ लेबल करता है। ' ${0:2}
' के पहले दो वर्णों को स्ट्रिप्स करता है $0
, अर्थात ' ./
', लेकिन यह स्पष्ट रूप से मान्यता प्राप्त नहीं है sh
।
बेशक, अपनी आवश्यकताओं के लिए tweak।