重命名具有各种扩展名的文件

时间:2013-05-22 11:21:24

标签: bash sed awk rename

我有一个文件夹,其中包含各种随机文件扩展名以及根本没有扩展名。我希望从文件名中删除扩展名。我觉得我可能会走很长的路,但是我想避免使用两个列表和移动命令,因为它无法在飞行中进行。

我正在使用的代码将创建一个变量以保留扩展名,我正在尝试使用sed语法调用rename命令以从文件中删除变量。

for i in `ls`; do 
        blah=$(echo $i |awk -F . '{if (NF>1) {print $NF}}')
        echo \.$blah
        rename 's/\.$blah//' $i  

done 

我得到的错误是:全局符号“$ blah”需要在(eval 1)第1行显式包名

此时我将使用前后列构建一个csv,并使用它来删除文件名,但为了将来参考,我想知道如何实现这一点。

我看到有关使用重命名进行单个或几个扩展的大量帖子:

rename 's/.mp3//' *.mp3

但是由于不同扩展的数量......

3 个答案:

答案 0 :(得分:5)

遵循bash命令应该完成工作:

for f in *.*; do mv "$f" "${f%.*}"; done

答案 1 :(得分:4)

系统中的

rename是在Perl中实现的,这就是错误的来源。你使用单引号,这意味着变量没有展开,Perl没有找到变量$ blah的定义。

此外,如果您的文件名包含空格,for i in `ls`可能是错误的。最好使用通配符,如

for i in *.*

对于名称没有扩展名的文件,如good.mp3good.jpg,您想要做什么?你想覆盖其中一个吗?

要对所有带扩展名的文件使用rename,您可以尝试

rename 's/\..*//' *.*

如前所述,它仍然会覆盖一些文件。此外,名称为a.b.c.d的文件只会重命名为a

答案 2 :(得分:2)

如果需要,可以使用bash参数扩展来去除扩展名。你也不需要ls来获取所有文件

for i in *; do echo "$i to ${i%.*}" mv "$i" "${i%.*}"; done

现在为a.b.c - >使用“%%”,对于a.b,使用“%”,如上所述

更新:(对于名称中包含空格的文件)

[[bash_prompt$]]$ ls -l
total 0
[[bash_prompt$]]$ touch "file space.sh" "another space .sh"
[[bash_prompt$]]$ ls
another space .sh  file space.sh
[[bash_prompt$]]$ for i in *; do mv "$i" "${i%%.*}"; done
[[bash_prompt$]]$ ls
another space   file space