कमांड "ढूंढें" -exec की जगह स्ट्रिंग


0

मैं एक पीडीएफ ट्री में JPG फाइल खोजने की कोशिश कर रहा हूँ ताकि इसे पीडीएफ में बदलने के लिए कमांड "" निष्पादित किया जा सके।

समस्या यह है कि मैं जिस कोड को चला रहा हूं, वह उसी निर्देशिका में फ़ाइल को छोड़ता है और मैं इसे स्थानांतरित करना चाहता हूं, लेकिन फाइलों के पेड़ की संरचना को संरक्षित करता है।

मैंने अब तक क्या कोशिश की है:

find . -iname '*.jpg' -exec mogrify -format pdf '{}' \;

यह कमांड पूरी तरह से काम करता है। मैं इसकी सामग्री के एक हिस्से को शिफ्ट करना "{}" में हेरफेर करना चाहता हूं;

{} = ./1/aa.xxx

और मैं इसे रूपांतरित करना चाहता हूं:

{} = ./new/1/aa.pdf

@ mpez0 के लिए धन्यवाद, मैं बदलावों का थोड़ा समाधान कर सकता हूं:

find . -iname '*.jpg' | while read file ; do 
oldfile=${file##*/};
olddir=${file/"$oldfile"/""};
pdfdir=${file/'./''./PDF'};
pdfdir=${pdfdir/"$oldfile"/""};
savedir=${file/'./''./OLD'};
savedir=${savedir/"$oldfile"/""};
newfile=${oldfile/.[Jj][Pp][Gg]/.pdf};
mogrify -format pdf "$file"; 
mkdir -p "$pdfdir";
mkdir -p "$savedir";
mv -- "$olddir$newfile" "$pdfdir$newfile"; 
mv -- "$olddir$oldfile" "$savedir$oldfile"; 
done

यह कोड क्या है:
find . -iname '*.jpg' उन सभी फ़ाइलों को खोजें जो jpg और जेपीईजी के साथ समाप्त होती हैं
while read file ; do यदि क्रिया को एआई फ़ाइल मिलती है, तो चर में रूट को सहेजें file
oldfile=${file##*/}; फ़ाइल पॅट को बाहर निकालें और चर में फ़ाइल का ते नाम सहेजें oldfile
olddir=${file/"$oldfile"/""}; पैट को बचाने के लिए फ़ाइल का नाम निकालें olddir
pdfdir=${file/'./''./PDF'}; परिवर्तन pdfdir
pdfdir=${pdfdir/"$oldfile"/""}; pdf pat को बचाने के लिए फ़ाइल का नाम निकालें pdfdir
savedir=${file/'./''./OLD'}; परिवर्तन savedir
savedir=${savedir/"$oldfile"/""}; pdf pat को बचाने के लिए फ़ाइल का नाम निकालें savedir
newfile=${oldfile/.[Jj][Pp][Gg]/.pdf}; उस नई फ़ाइल का नाम सहेजें जिसे बनाया जाएगा newfile
mogrify -format pdf "$file"; परिवर्तित करें file पीडीएफ के लिए
mkdir -p "$pdfdir"; पैट की निर्देशिका बनाएँ pdfdir
mkdir -p "$savedir"; पैट की निर्देशिका बनाएँ savedir
mv -- "$olddir$newfile" "$pdfdir$newfile"; नई पीडीएफ फाइल को पीडीएफ डायरेक्टर के पास ले जाएं mv -- "$olddir$oldfile" "$savedir$oldfile"; पुरानी jpg फ़ाइल को पुरानी निर्देशिका में ले जाएँ done प्रक्रिया को समाप्त करें

मुझे उम्मीद है कि इससे दूसरों को मदद मिलेगी


क्या आउटपुट लोकेशन के लिए -o फ्लैग को mogrify करता है? कोड को थोड़ा सरल करेगा। यह भी, आप किस ओएस का उपयोग कर रहे हैं? अधिक विशेष रूप से, क्या खोल? खोजने के साथ, क्या हम एक लिनक्स शेल मान सकते हैं?
Rich Homolka

अमीर, मैं भी मैक में लाइन में बैश का उपयोग कर रहा हूँ, कोई mogrify नहीं है यह है।
Alejandro O'Byrne

@ AlejandroO'Byrne कृपया अपने प्रश्न के संपादन निकाय के बजाय उत्तर के रूप में समाधान पोस्ट करें (आप कर सकते हैं अपने सवाल का जवाब दें )। यहां तक ​​कि आप कर सकते हैं उत्तर स्वीकार करें भी, जो आपके लिए काम किया है।
αғsнιη

जवाबों:


1
find . -iname '*.jpg' | while read f ; do 
    new=`echo $f | sed -e 's/\.[Jj][Pp][Gg]$/.pdf/'`; 
    newd=`dirname $f`;
    newd="new/$newd" 
    mogrify -format pdf $f; 
    mv $new $newd; 
done

बेशक, मैं स्क्रिप्ट को प्रतिध्वनित करने की सलाह देता हूं mogrify तथा mv आदेश देता है। अगर mogrify एक आउटपुट विकल्प प्रदान करता है, जिसका उपयोग mv के बजाय करें। आपको एक खोज करना और सभी कार्य करना सरल लग सकता है mogrify रूपांतरित करता है, फिर नए .pdfs एकत्र करता है।


थोड़े बदलाव के साथ धन्यवाद, मुझे आपके सुझाव से समाधान मिल गया है। धन्यवाद
Alejandro O'Byrne

1

यदि तुम प्रयोग करते हो convert के बजाय mogrify (उसी सुइट का हिस्सा), आपकी आज्ञा तब बन जाती है:

find . -iname '*.jpg' -exec convert -format pdf '{}' new/'{}'.pdf \;

भिन्न mogrify, convert उपयोग एक अद्यतन फ़ाइल एक्सटेंशन नहीं बनाता है, इसलिए आपको मिलेगा .jpg.pdf (प्लस कैपिटलाइज़ेशन) नई फ़ाइल एक्सटेंशन के रूप में, लेकिन इसके साथ बदलना आसान है rename:

find new -iname '*.jpg.pdf' -exec rename 's/\.[Jj][Pp][Gg]//' '{}' \;

आप जेपीईजी को बाद में हटा सकते हैं यदि आपको उन्हें रखने की आवश्यकता नहीं है (मुझे आशा है कि आपको ज़रूरत नहीं है उस कमांड स्पेलिंग बाहर)।


यह काम नहीं किया
Alejandro O'Byrne

क्या काम नहीं करता है? मैंने एक अस्थायी निर्देशिका में एक एकल फ़ाइल के साथ दोनों आदेशों की जाँच की। हो सकता है कि निर्देशिका संरचना को पहले से उपयोग करके बनाया जाना चाहिए find . -type d -exec mkdir new/'{}' \;। ध्यान दें कि यह निर्देशिका तब भी बनाएगा जब इसमें कोई JPEG फ़ाइल न हो। इसके लिए बहुत अधिक जटिल होने की आवश्यकता होगी, लेकिन आप बाद में खाली निर्देशिकाओं को हमेशा हटा सकते हैं find new/ -type d -exec rmdir '{}' \;
AFH
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.