मैं awk/SED/बैश के साथ अपरकेस में लोअरकेस फ़ाइल नाम बदलना चाहते हैंawk, SED या बैश के साथ अपरकेस में लोअरकेस फ़ाइल नाम बदलने
आपकी मदद की सराहना की जाएगी
aaaa.txt
vvjv.txt
acfg.txt
वांछित आउटपुट
AAAA.txt
VVJV.txt
ACFG.txt
मैं awk/SED/बैश के साथ अपरकेस में लोअरकेस फ़ाइल नाम बदलना चाहते हैंawk, SED या बैश के साथ अपरकेस में लोअरकेस फ़ाइल नाम बदलने
आपकी मदद की सराहना की जाएगी
aaaa.txt
vvjv.txt
acfg.txt
वांछित आउटपुट
AAAA.txt
VVJV.txt
ACFG.txt
प्रस्तावना:
आप अपने एक्सटेंशन के मामले के बारे में परवाह नहीं है, बस एक खोल पाश में 'tr' उपयोगिता का उपयोग करें:
for i in *.txt; do mv "$i" "$(echo "$i" | tr '[a-z]' '[A-Z]')"; done
आप एक्सटेंशन के मामले के बारे में परवाह है, तो आपको लगता है कि पता होना चाहिए ऐसा करने के एक से अधिक तरीके हैं (TIMTOWTDI)। व्यक्तिगत रूप से, मेरा मानना है कि पर्ल समाधान, यहां सूचीबद्ध है, शायद लिनक्स के तहत सबसे सरल और सबसे लचीला समाधान है। यदि आपके पास एकाधिक फ़ाइल एक्सटेंशन हैं, तो बस उस नंबर को निर्दिष्ट करें जिसे आप अपरिवर्तित रखना चाहते हैं। BASH4 समाधान भी एक बहुत अच्छा है, लेकिन आपको एक्सटेंशन को कुछ बार लिखने के लिए तैयार होना चाहिए, या वैकल्पिक रूप से, इसे स्टोर करने के लिए किसी अन्य चर का उपयोग करना चाहिए। लेकिन अगर आपको गंभीर पोर्टेबिलिटी की ज़रूरत है तो मैं इस जवाब में अंतिम समाधान की सिफारिश करता हूं जो ऑक्टल का उपयोग करता है। लिनक्स के कुछ स्वाद भी नामक टूल के साथ शिप करते हैं का नाम बदलें जो जांच के लायक भी हो सकता है। इसका उपयोग distro से distro में भिन्न होगा, इसलिए अधिक जानकारी के लिए man rename
टाइप करें।
समाधान:
का उपयोग Perl:
# single extension
perl -e 's/\.[^\.]*$/rename $_, uc($`) . $&/e for @ARGV' *.txt
# multiple extensions
perl -e 's/(?:\.[^\.]*){2}$/rename $_, uc($`) . $&/e for @ARGV' *.tar.gz
का उपयोग BASH4:
# single extension
for i in *.txt; do j="${i%.txt}"; mv "$i" "${j^^}.txt"; done
# multiple extensions
for i in *.tar.gz; do j="${i%.tar.gz}"; mv "$i" "${j^^}.tar.gz"; done
# using a var to store the extension:
e='.tar.gz'; for i in *${e}; do j="${i%${e}}"; mv "$i" "${j^^}${e}"; done
GNU awk का उपयोग करना:
for i in *.txt; do
mv "$i" $(echo "$i" | awk '{ sub(/.txt$/,""); print toupper($0) ".txt" }');
done
का उपयोग GNU sed:
for i in *.txt; do
mv "$i" $(echo "$i" | sed -r -e 's/.*/\U&/' -e 's/\.TXT$/\u.txt/');
done
का उपयोग BASH3.2:
+०१२३५१६४१०६१for i in *.txt; do
stem="${i%.txt}";
for ((j=0; j<"${#stem}"; j++)); do
chr="${stem:$j:1}"
if [[ "$chr" == [a-z] ]]; then
chr=$(printf "%o" "'$chr")
chr=$((chr - 40))
chr=$(printf '\'"$chr")
fi
out+="$chr"
done
mv "$i" "$out.txt"
out=
done
n.b. मैड/डार्विन/बीएसडी (गैर-लिनक्स?) * sed * – Orwellophile
@ ऑरवेलोफाइल के साथ संगत समाधान संगत नहीं है: जीएनयू sed बीएसडी sed नहीं है। बीएसडी जीएनयू जैसे लिनक्स लिनक्स है। – Steve
यह सोलारिस के साथ भी काम नहीं करता है। (वह एसवाईएसवी है)। लेकिन आपका सुधार उल्लेखनीय है। यह ** sed ** – Orwellophile
सामान्य रूप से लोअरकेस/ऊपरी केस संशोधनों के लिए "tr" (अक्षरों का अनुवाद) उपयोगिता का उपयोग अक्सर किया जाता है, यह चरित्र प्रतिस्थापन के लिए उपयोग की जाने वाली कमांड लाइन उपयोगिता के सेट से है।
dtpwmbp:~ pwadas$ echo "xxx" | tr '[a-z]' '[A-Z]'
XXX
dtpwmbp:~ pwadas$
इसके अलावा, फाइलों का नाम बदलने के लिए "नाम बदलें" उपयोगिता है, जो perl (आदमी नाम बदलें) के साथ वितरित की जाती है।
SYNOPSIS
rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]
DESCRIPTION
"rename" renames the filenames supplied according to the rule specified as the first argument. The perlexpr argument is a Perl expression which is expected to modify the $_ string in
Perl for at least some of the filenames specified. If a given filename is not modified by the expression, it will not be renamed. If no filenames are given on the command line,
filenames will be read via standard input.
For example, to rename all files matching "*.bak" to strip the extension, you might say
rename 's/\.bak$//' *.bak
To translate uppercase names to lower, you'd use
rename 'y/A-Z/a-z/' *
for f in *.txt; do
mv "$f" "`tr [:lower:] [:upper:] <<< "${f%.*}"`.txt"
done
वह "txt" एक्सटेंशन को कैपिटल करेगा। इसके अलावा, बैश के साथ, यहां एक स्ट्रिंग का उपयोग करें: 'tr [: upper] [: lower:] <<<" $ f "' –
@glennjackman अच्छा बिंदु। '$ {f%। *} 'का ध्यान रखना चाहिए। फिक्स्ड। –
बैश 4 पैरामीटर विस्तार मामले प्रदर्शन कर सकते हैं परिवर्तन:
for i in *.txt; do
i="${i%.txt}"
mv "$i.txt" "${i^^?}.txt"
done
बैश:
for f in *.txt; do
no_ext=${f%.txt}
mv "$f" "${no_ext^^}.txt"
done
यह आपके लिए (जीएनयू sed) काम कर सकते हैं:
printf "%s\n" *.txt | sed 'h;s/[^.]*/\U&/;H;g;s/\(.*\)\n/mv -v \1 /' | sh
या अधिक बस:
printf "%s\n" *.txt | sed 'h;s/[^.]*/\U&/;H;g;s/\(.*\)\n/mv -v \1 /e'
मैं, rename
उपयोग करने का सुझाव अगर आप केवल, फ़ाइल नाम और नहीं विस्तार अपरकेस कुछ इस तरह का उपयोग करना चाहते हैं:
rename -n 's/^([^.]*)\.(.*)$/\U$1\E.$2/' *
\U
\E
जब तक सब कुछ uppercases, देखें perlreref(1)। आउटपुट के साथ खुश होने पर -n
हटाएं।
आप^और $ एंकर जोड़ सकते हैं, और स्पष्ट रूप से '।' की आवश्यकता होती है, इसलिए मिलान रेगेक्स अनुभाग लालची या आलसी होने पर निर्भर नहीं है; बस इसे और अधिक पठनीय IMHO बनाता है। –
यह ओपी चाहता है के साथ बेहतर फिट बैठता है। मैंने आपके सुझाव जोड़े हैं – Thor
एक आसान, हल्के और पोर्टेबल दृष्टिकोण होगा:
for i in *.txt
do
fname=$(echo $i | cut -d"." -f1 | tr [a-z] [A-Z])
ext=$(echo $i | cut -d"." -f2)
mv $i $fname.$ext
done
इस मार के लगभग हर संस्करण पर काम के बाद से हम सबसे आम बाहरी उपयोगिताओं (कट, टीआर) हर यूनिक्स स्वाद पर पाया का उपयोग कर रहे हैं।
सीधे शब्दों में (टर्मिनल पर) का उपयोग करें:
for i in *.txt; do mv $i `echo ${i%.*} | tr [:lower:] [:upper:]`.txt; done;
for i in *.jar; do mv $i `echo ${i%} | tr [:upper:] [:lower:]`; done;
यह मेरे लिए काम करता है।
1. मैंने अपने मज़ेदार फ़ाइल नामों को एक बैश वन-लाइनर के साथ बदलने के लिए इन युक्तियों का उपयोग किया: I in ./*.*; एमवी "$ i" "$ (echo" $ i "| tr '[:? = &]' '[_]')"; किया हुआ ; 2. क्रॉस संदर्भ fyi भी अजीब यूनिकोड वर्णों से निपटने के लिए: http://stackoverflow.com/questions/3011569/how-do-i-convert-filenames-from-unicode-to-ascii – AnneTheAgile