2012-09-17 12 views
5

मैं awk/SED/बैश के साथ अपरकेस में लोअरकेस फ़ाइल नाम बदलना चाहते हैंawk, SED या बैश के साथ अपरकेस में लोअरकेस फ़ाइल नाम बदलने

आपकी मदद की सराहना की जाएगी

aaaa.txt 
vvjv.txt 
acfg.txt 

वांछित आउटपुट

AAAA.txt 
VVJV.txt 
ACFG.txt 
+0

1. मैंने अपने मज़ेदार फ़ाइल नामों को एक बैश वन-लाइनर के साथ बदलने के लिए इन युक्तियों का उपयोग किया: I in ./*.*; एमवी "$ i" "$ (echo" $ i "| tr '[:? = &]' '[_]')"; किया हुआ ; 2. क्रॉस संदर्भ fyi भी अजीब यूनिकोड वर्णों से निपटने के लिए: http://stackoverflow.com/questions/3011569/how-do-i-convert-filenames-from-unicode-to-ascii – AnneTheAgile

उत्तर

15

प्रस्तावना:

आप अपने एक्सटेंशन के मामले के बारे में परवाह नहीं है, बस एक खोल पाश में '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 
+0

n.b. मैड/डार्विन/बीएसडी (गैर-लिनक्स?) * sed * – Orwellophile

+0

@ ऑरवेलोफाइल के साथ संगत समाधान संगत नहीं है: जीएनयू sed बीएसडी sed नहीं है। बीएसडी जीएनयू जैसे लिनक्स लिनक्स है। – Steve

+0

यह सोलारिस के साथ भी काम नहीं करता है। (वह एसवाईएसवी है)। लेकिन आपका सुधार उल्लेखनीय है। यह ** sed ** – Orwellophile

9

सामान्य रूप से लोअरकेस/ऊपरी केस संशोधनों के लिए "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/' * 
1
for f in *.txt; do 
    mv "$f" "`tr [:lower:] [:upper:] <<< "${f%.*}"`.txt" 
done 
+0

वह "txt" एक्सटेंशन को कैपिटल करेगा। इसके अलावा, बैश के साथ, यहां एक स्ट्रिंग का उपयोग करें: 'tr [: upper] [: lower:] <<<" $ f "' –

+0

@glennjackman अच्छा बिंदु। '$ {f%। *} 'का ध्यान रखना चाहिए। फिक्स्ड। –

1

बैश 4 पैरामीटर विस्तार मामले प्रदर्शन कर सकते हैं परिवर्तन:

for i in *.txt; do 
    i="${i%.txt}" 
    mv "$i.txt" "${i^^?}.txt" 
done 
1

बैश:

for f in *.txt; do 
    no_ext=${f%.txt} 
    mv "$f" "${no_ext^^}.txt" 
done 
0

यह आपके लिए (जीएनयू 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' 
4

मैं, rename उपयोग करने का सुझाव अगर आप केवल, फ़ाइल नाम और नहीं विस्तार अपरकेस कुछ इस तरह का उपयोग करना चाहते हैं:

rename -n 's/^([^.]*)\.(.*)$/\U$1\E.$2/' * 

\U\E जब तक सब कुछ uppercases, देखें perlreref(1)। आउटपुट के साथ खुश होने पर -n हटाएं।

+0

आप^और $ एंकर जोड़ सकते हैं, और स्पष्ट रूप से '।' की आवश्यकता होती है, इसलिए मिलान रेगेक्स अनुभाग लालची या आलसी होने पर निर्भर नहीं है; बस इसे और अधिक पठनीय IMHO बनाता है। –

+0

यह ओपी चाहता है के साथ बेहतर फिट बैठता है। मैंने आपके सुझाव जोड़े हैं – Thor

1

एक आसान, हल्के और पोर्टेबल दृष्टिकोण होगा:

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 

इस मार के लगभग हर संस्करण पर काम के बाद से हम सबसे आम बाहरी उपयोगिताओं (कट, टीआर) हर यूनिक्स स्वाद पर पाया का उपयोग कर रहे हैं।

1

सीधे शब्दों में (टर्मिनल पर) का उपयोग करें:

for i in *.txt; do mv $i `echo ${i%.*} | tr [:lower:] [:upper:]`.txt; done; 
0
for i in *.jar; do mv $i `echo ${i%} | tr [:upper:] [:lower:]`; done; 

यह मेरे लिए काम करता है।