我想改成小写的文件名使用awk /桑达/ bash的,以大写改小写文件名使用awk,sed的或bash为大写
你的帮助,将不胜感激
aaaa.txt
vvjv.txt
acfg.txt
所需的输出
AAAA.txt
VVJV.txt
ACFG.txt
我想改成小写的文件名使用awk /桑达/ bash的,以大写改小写文件名使用awk,sed的或bash为大写
你的帮助,将不胜感激
aaaa.txt
vvjv.txt
acfg.txt
所需的输出
AAAA.txt
VVJV.txt
ACFG.txt
前言:
如果你不关心你的扩展的情况下,只需使用“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
n.b. sed解决方案不兼容Mac/Darwin/BSD(非Linux?)* sed * – Orwellophile
@Orwellophile:GNU sed不是BSD sed。 BSD是Linux,就像GNU是Linux一样。 – Steve
它也不适用于Solaris。 (这是SYSV)。但您的更正被记录。它不适用于** sed **的非GNU版本** – 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”扩展名。另外,在bash中,使用here-string:'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
这可能为你工作(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'
我会建议使用rename
,如果你只是想为大写的文件名,而不是扩展,使用这样的:
rename -n 's/^([^.]*)\.(.*)$/\U$1\E.$2/' *
\U
转换为大写的一切,直到\E
,看perlreref(1)。当你对输出满意时,移除-n
。
您可能会添加^和$锚,并明确要求'。',所以匹配不依赖于正则表达式部分是贪婪还是懒惰;只是使它更可读恕我直言。 –
这与OP想要的更适合。我已经添加了你的建议 – 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
,因为我们使用的是最常见的外部工具(切,TR)发现在每一个Unix版本这将BASH的几乎每一个版本上工作。
(对终端),只需使用:
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.我使用这些提示来改变我的有趣的文件名与bash单行:为我在./*.*;做mv“$ i”“$(echo”$ i“| tr'[:?=&&'''[_]')”;完成; 2.跨引用fyi处理甚至奇怪的unicode字符:http://stackoverflow.com/questions/3011569/how-do-i-convert-filenames-from-unicode-to-ascii – AnneTheAgile