使用各种扩展名重命名文件

Posted

技术标签:

【中文标题】使用各种扩展名重命名文件【英文标题】:Renaming files with various extensions 【发布时间】:2013-05-17 10:15:49 【问题描述】:

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

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

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

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

【问题讨论】:

只需将你的行改为rename "s/\.$blah//" $i,即用双引号括起来。 【参考方案1】:

按照bash 命令应该可以完成这项工作:

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

【讨论】:

@JakubM.:是的。它会删除与正则表达式.* 匹配的$f 的最短后缀。所以,从最后一个. 直到字符串结束。 学究式地说,这不是正则表达式:它是文件名扩展模式或 glob 模式【参考方案2】:

您系统中的rename 是在Perl 中实现的,这就是错误的来源。你用了单引号,表示变量没有展开,Perl没有找到变量$blah的定义。

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

for i in *.*

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

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

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

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

【讨论】:

【参考方案3】:

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

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

现在对于 a.b.c -> a 使用 "%%" ,对于 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

【讨论】:

以上是关于使用各种扩展名重命名文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 NetBeans 重命名文件扩展名?

文件夹为啥无法重命名?

重命名文件扩展名不起作用

Kotlin扩展函数 ③ ( 定义扩展文件 | 重命名扩展函数 | Kotlin 标准库扩展函数 )

重命名所有“。”到文件名中的“_”,扩展名除外

查找和重命名没有扩展名的文件?