बड़ी संख्या में पीडीएफ फाइलों में वाक्यांशों को खोजने के लिए कमांड लाइन टूल


9

मैं एक निर्देशिका के अंदर बड़ी संख्या में पीडीएफ फाइलों में वाक्यांशों को खोजने के लिए कमांड लाइन टूल का उपयोग कर रहा हूं। विंडोज एक्सपी में एक्सप्लोरर खोज इसकी अनुमति देता है लेकिन बहुत धीमी है। यहाँ grep युक्तियाँ है?



मैं पहले कमांड लाइन टूल्स जानना चाहता हूं और अगर GUI टूल हैं, तो इसका उपयोग भी अच्छा होगा। Whatingrep केवल विंडोज के अंतर्गत है। और मैं केवल पीडीएफ फाइलों को खोजना चाहता हूं, इसलिए इसके लिए अनुकूलित एक एप्लिकेशन अच्छा होगा
iceman

जवाबों:


6
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);
} '

मुझे लगता है कि आपने "विंडोज एक्सपी" या विंडोज़-सर्च टैग का उल्लेख करने वाले सवाल का हिस्सा नहीं देखा । मुझे पता है कि सवाल (उलझन में) "ओपनसेस" से शुरू हुआ था , लेकिन लिनक्स संदर्भों की तुलना में अधिक विंडोज संदर्भ हैं; खासकर जब आप उसकी बाद की टिप्पणी भी गिनते हैं ।
सिनेटेक

@ एसनेटेक: उन्होंने "विंगरेप केवल विंडोज के अंतर्गत है" के साथ एक उत्तर को अस्वीकार कर दिया, जो बताता है कि वह एक लिनक्स समाधान चाहते हैं।
मेकैनिकल घोंघा

@ मेकैनिकल, उन्होंने इसे अस्वीकार कर दिया क्योंकि यह एक जीयूआई उपकरण है जहां कमांड लाइन टूल के लिए कहा गया है।
सिनटेक ech

3

लिनक्स और विंडोज दोनों के तहत, आप एक्रोबैट रीडर का उपयोग कर सकते हैं, जिसमें कई फाइलों को खोजने की आज्ञा है।

लिनक्स के तहत, रिकॉल है, जो आपकी पीडीएफ़ फ़ाइलों (और अधिक) के सूचकांक का निर्माण करेगा, जब आप इसे पहली बार चलाते हैं। इंडेक्स बनने के बाद, शब्द खोज बहुत तेज होनी चाहिए; वाक्यांश खोज वाजिब होनी चाहिए। सुनिश्चित करें कि pdftotextरिकॉल शुरू करने से पहले कमांड इंस्टॉल किया गया है; डेबियन और उबंटू के तहत, यह poppler-utilsपैकेज में है, मुझे Suse के बारे में नहीं पता।

या आप फ़ाइलों को सीधे पाठ में बदल सकते हैं और नीचे दिए गए आदेशों के साथ पाठ फ़ाइलों पर grep का उपयोग कर सकते हैं।

find -name '* * .pdf' -exec pdftotext {} \;
grep -r --include '* .txt' -l -F "सटीक वाक्यांश खोज करने के लिए"
grep -r --include '* .txt' -l -E "खोज करने के लिए नियमित अभिव्यक्ति"

एडोब एक पूरी निर्देशिका के तहत खोज करने की अनुमति नहीं देगा, यह सिर्फ एक फ़ाइल के अंदर ऐसा करेगा। मैं पहले कमांड लाइन टूल जानना चाहता हूं और अगर GUI टूल हैं, तो इसका भी अच्छा होगा
iceman

लिनक्स के तहत एडोब रीडर 9 में एक "एडिट | सर्च" मेनू प्रविष्टि है जो आपको एक निर्देशिका में सभी पीडीएफ फाइलों में खोज करने की अनुमति देती है। कमांड लाइन पर, उन सभी विधियों के बारे में पता चलता है जिनमें pdftotext( स्टेप जैसे उपकरण स्वचालित रूप से करेंगे)।
गिल्स एसओ- बुराई को रोकें '

1
Recoll के लिए +1। फ़ाइलों को अनुक्रमित करने से समय बच जाएगा यदि आपके पास बहुत कुछ है और आप उन्हें अक्सर खोजते हैं।
मैकेनिकल घोंघा

1

Adobe रीडर एक्स काम करता है और यह करता है न केवल एक फ़ाइल के अंदर एक पूरी निर्देशिका और उप निर्देशिकाओं के तहत खोज की अनुमति देते हैं, लेकिन यह एक कमांड लाइन कार्यक्रम नहीं है।


क्या यह एक्रोबेट एक्स के नवीनतम संस्करण में है? कौन सा रिलीज?
iceman

मैंने एक्रोबैट इंडेक्सिंग टूल की कोशिश की और इसे आदिम कहना एक तारीफ है। recollडेबियन पर हाथ से स्थापित, अब इसे अपने विंडोज़-आधारित कर्मचारियों के लिए उपयोग करने योग्य बनाने की कोशिश कर रहा है।
क्रिस के

0

अपने घर निर्देशिका की उन सभी फाइलों को पुन: सूचीबद्ध करने के लिए जिनमें पीडीएफ फाइल एक्सटेंशन है और जिसमें एक पंक्ति है जो [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।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.