2012-09-17 180 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; 

这对我的作品。