2012-09-17 87 views
5

我想改成小寫的文件名使用awk /桑達/ bash的,以大寫改小寫文件名使用awk,sed的或bash爲大寫

你的幫助,將不勝感激

aaaa.txt 
vvjv.txt 
acfg.txt 

所需的輸出

AAAA.txt 
VVJV.txt 
ACFG.txt 
+0

1.我使用這些提示來改變我的有趣的文件名與bash單行:爲我在./*.*;做mv「$ i」「$(echo」$ i「| tr'[:?=&&'''[_]')」;完成; 2.跨引用fyi處理甚至奇怪的unicode字符:http://stackoverflow.com/questions/3011569/how-do-i-convert-filenames-from-unicode-to-ascii – AnneTheAgile

回答

15

前言:

如果你不關心你的擴展的情況下,只需使用「TR」工具在shell循環:

for i in *.txt; do mv "$i" "$(echo "$i" | tr '[a-z]' '[A-Z]')"; done 

如果你關心的延伸的話,那麼你應該知道,有多種方法可以做到這一點(TIMTOWTDI)。就我個人而言,我相信這裏列出的Perl解決方案可能是Linux下最簡單和最靈活的解決方案。如果您有多個文件擴展名,只需指定您希望保持不變的數字即可。解決方案也是一個很好的解決方案,但是您必須願意多次寫出擴展,或者使用其他變量來存儲它。但是如果你需要認真的可移植性,那麼我建議在這個答案中使用八進制的最後一個解決方案。某些Linux版本還附帶一個名爲的工具,它可以重命名爲,這也值得一試。它的使用將從發行版到發行版有所不同,因此請輸入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解決方案不兼容Mac/Darwin/BSD(非Linux?)* sed * – Orwellophile

+0

@Orwellophile:GNU sed不是BSD sed。 BSD是Linux,就像GNU是Linux一樣。 – Steve

+0

它也不適用於Solaris。 (這是SYSV)。但您的更正被記錄。它不適用於** sed **的非GNU版本** – 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」擴展名。另外,在bash中,使用here-string:'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

這可能爲你工作(GNU 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,看perlreref(1)。當你對輸出滿意時,移除-n

+0

您可能會添加^和$錨,並明確要求'。',所以匹配不依賴於正則表達式部分是貪婪還是懶惰;只是使它更可讀恕我直言。 –

+0

這與OP想要的更適合。我已經添加了你的建議 – 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 

,因爲我們使用的是最常見的外部工具(切,TR)發現在每一個Unix版本這將BASH的幾乎每一個版本上工作。

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; 

這對我的作品。