/ / डीबगिंग पर्ल वन-लाइनर फ़ाइलों का नाम बदलने के लिए - पर्ल

फ़ाइलों का नाम बदलने के लिए पर्ल एक-लाइनर डिबगिंग - perl

मैं परीक्षण / प्रयास कर रहा था यह पर्ल वन-लाइनर है, और मैं यह पता लगाने की कोशिश कर रहा हूं कि फाइलों का क्या हुआ। मैं अब फाइलों को नहीं देखता। क्या मैंने उन्हें हटा दिया या क्या गलत हुआ?

सूचीबद्ध फ़ाइल नामों का उदाहरण (मूल):

IMG_0178.JPG
IMG_0182.JPG
IMG_0183.JPG
IMG_0184.JPG
IMG_0186.JPG

मैं केवल फ़ाइल एक्सटेंशन को लोअरकेस (.jpg) में बदलना चाहता था:

perl -e"while(<*.JPG>) { s/JPG$/jpg/; rename <*.jpg>, $_ }"

उत्तर:

जवाब के लिए 9 № 1

उपयोग नहीं करते हैं rename एक ग्लोब के साथ। स्केलर का प्रयोग करें। प्रतिस्थापन से पहले फ़ाइल नाम को एक नए चर में निर्दिष्ट करने का प्रयास करें और पुराने नाम को संशोधित एक के रूप में बदलें, जैसे:

perl -e"while(<*.JPG>) { ($new = $_) =~ s/JPG$/jpg/; rename $_, $new }"

के साथ आउटपुट की जाँच करें ls -1:

IMG_0178.jpg
IMG_0182.jpg
IMG_0183.jpg
IMG_0184.jpg
IMG_0186.jpg

जवाब के लिए 4 № 2

विचित्र रूप से आपके कोड को वही करना चाहिए जो आप चाहते थे।

जैसे एक फ़ाइल ग्लोब <*.JPG> स्केलर के संदर्भ में पैटर्न से मेल खाने वाली अगली फ़ाइल और दोनों के बाद से वापस आ जाएगी while तथा rename स्केलर संदर्भ लागू करें, दो ग्लोब प्रत्येक पुनरावृत्ति पर समान मान लौटाते हैं।

while (<*.JPG>) {
s/JPG$/jpg/;
rename <*.jpg>, $_;
}

लूप की पहली पुनरावृत्ति में $_ करने के लिए सेट है IMG_0178.JPG से while, और प्रतिस्थापन फ़ाइल प्रकार को निम्न स्थिति में सेट करता है।

फिर नाम बदले में <*.jpg> स्केलर संदर्भ में निष्पादित किया जाता है और फिर से रिटर्न होता है IMG_0178.JPG - उसी सूची में पहली फ़ाइल क्योंकि Windows फ़ाइल नाम केस-असंवेदनशील हैं।

तो अंत में नाम बदल जाता है rename "IMG_0178.JPG", "IMG_0178.jpg" आवश्यकतानुसार ।

पुनर्लेखन rename इस तरह यह स्पष्ट रूप से पता चलता है

sub ren($$) {
print "$_[0] -> $_[1]n";
}

while (my $file = <*.JPG>) {
$file =~ s/JPG$/jpg/;
ren <*.JPG>, $file;
}

उत्पादन

IMG_0178.JPG -> IMG_0178.jpg
IMG_0182.JPG -> IMG_0182.jpg
IMG_0183.JPG -> IMG_0183.jpg
IMG_0184.JPG -> IMG_0184.jpg
IMG_0186.JPG -> IMG_0186.jpg

तो आप भाग्यशाली हैं, और आपकी फ़ाइलों का नाम बदला जाना चाहिए जैसा कि आप चाहते थे।

परंतु डॉन "t यह करो। विशेष रूप से आपको किसी भी महत्वपूर्ण संचालन के स्थान पर प्रिंट स्टेटमेंट के साथ कार्यक्रम चलाना चाहिए ताकि आप देख सकें कि क्या होने वाला है।

यह बेहतर होगा क्योंकि आईडी अधिक स्पष्ट रूप से वही करता है जो इरादा है

perl -e "($f = $_) =~ s/JPG$/jpg/i and rename $_, $f while <*.JPG>"