2014-05-13 8 views
7

के साथ पीडीएफ फ़ाइलों को मर्ज करें मैं एक पीडीएफ फ़ाइल में एक निर्देशिका के सभी पीडीएफ फ़ाइलों को मर्ज करने के लिए एक बैश स्क्रिप्ट लिखने की कोशिश कर रहा हूं। आदेश pdfunite *.pdf output.pdf सफलतापूर्वक प्राप्त करते हैं, लेकिन यह एक नियमित क्रम में इनपुट दस्तावेजों विलीन हो जाती है:लिनक्स कमांड संख्यात्मक प्रकार

1.pdf 10.pdf 11.pdf 2.pdf 3.pdf 4.pdf 5.pdf 6 .pdf 7.pdf 8.pdf 9.pdf

जब मैं दस्तावेजों एक संख्यात्मक क्रम में विलय हो करना चाहते हैं:

1.pdf 2.pdf 3.pdf 4.pdf 5.pdf 6.pdf 7.pdf 8.pdf 9.pdf 10.pdf 11.pdf

मैं एक आदेश मिश्रण ls -v या sort -n और pdfunite लगता है चाल चलती है लेकिन मुझे नहीं पता कि उन्हें कैसे गठबंधन करना है। कोई विचार नहीं कि मैं पीडीएफ फाइलों को को संख्यात्मक प्रकार के साथ कैसे विलय कर सकता हूं?

आप

उत्तर

20

आप आदेश का परिणाम एम्बेड $() का उपयोग कर सकते हैं, तो आप निम्न कर सकते

$ pdfunite $(ls -v *.pdf) output.pdf 

या

$ pdfunite $(ls *.pdf | sort -n) output.pdf 

हालांकि, टिप्पणी किसी भी मदद के लिए बहुत बहुत धन्यवाद यह तब काम नहीं करता है जब फ़ाइल नाम में व्हाइटस्पेस जैसे विशेष चरित्र होते हैं।

मामले में आप निम्न कर सकते हैं:

ls -v *.txt | bash -c 'IFS=$'"'"'\n'"'"' read -d "" -ra x;pdfunite "${x[@]}" output.pdf' 

हालांकि यह एक छोटा सा जटिल लगता है, इसके

का सिर्फ संयोजन

ध्यान दें कि आप xargs का उपयोग नहीं कर सकते हैं क्योंकि pdfunite के लिए इनपुट पीडीएफ तर्क के बीच के रूप में आवश्यक है। मैंने readarray का उपयोग करने से परहेज किया क्योंकि यह पुराने बैश संस्करण में समर्थित नहीं है, लेकिन यदि आपके पास bash है तो आप इसे IFS=.. read -ra .. के बजाय उपयोग कर सकते हैं।

+0

आपको बहुत बहुत धन्यवाद! मैं समाधान 1 और 2 काम की पुष्टि करता हूं लेकिन मुझे काम करने के लिए समाधान 3 (xargs) नहीं मिल सका। मुझे लगता है कि पीडीएफनाइट इनपुट को पहचान नहीं रहा है। क्या आप विवरण में अपने समाधान 3 की व्याख्या कर सकते हैं? – max

+0

क्षमा करें 'xargs -I {}' केवल तर्क एक को एक-एक करके लागू कर सकता है। इसे भूल जाओ, मैं नया जवाब लिखूंगा। – ymonad

+0

हां, वह जवाब वास्तव में थोड़ा गलत है (दूसरा 'sh' स्ट्रिंग कचरा है), इसलिए मैंने जवाब अपडेट किया और सही लिखा – ymonad

0

इसे कई चरणों में करें। मुझे लगता है कि आपके पास 1 से 99 तक फ़ाइलें हैं।

pdfunite $(find ./ -regex ".*[^0-9][0-9][^0-9].*" | sort) out1.pdf 
pdfunite out1.pdf $(find ./ -regex ".*[^0-9]1[0-9][^0-9].*" | sort) out2.pdf 
pdfunite out2.pdf $(find ./ -regex ".*[^0-9]2[0-9][^0-9].*" | sort) out3.pdf 

और इसी तरह।

अंतिम फ़ाइल में आपके सभी पीडीएफ संख्यात्मक क्रम में शामिल होंगे।

!!! आउटपुट फ़ाइल जैसे आउट 1.pdf आदि लिखने से सावधान रहें अन्यथा pdfunite अंतिम फ़ाइल को ओवरराइट करेगा !!!

संपादित करें: क्षमा करें मैं प्रत्येक रेगेक्स में [^ 0-9] खो रहा था। उपर्युक्त आदेशों में इसे ठीक किया गया।

+0

टिप के लिए धन्यवाद लेकिन यह सही ढंग से सॉर्ट नहीं करता है। यदि आप '1.pdf, 2.pdf, 11.pdf' मर्ज करते हैं, तो ऑर्डर' 11.pdf, 1.pdf, 2.pdf' होगा। 'Sort' को 'sort -n' में बदलना समस्या को ठीक नहीं करता है – max

+0

धन्यवाद और मैंने जवाब को सही किया। साथ ही, यह कहना चाहते हैं कि उपरोक्त आदेश सामान्य नहीं है, लेकिन अधिकांश मानव शैली वाली फ़ाइलों को शामिल करता है। – infoclogged

+0

इस सुधार के लिए धन्यवाद लेकिन यह अभी तक काम नहीं करता है। 'pdfunite $ (find ./ -regex"। * [^ 0-9] [0-9] [^ 0-9]। * "| sort) out1.pdf' 'out1.pdf' उत्पन्न करता है जिसमें 1.pdf शामिल है और 2. पीडीएफ केवल (11.pdf नहीं) – max

संबंधित मुद्दे