使用各种扩展名重命名文件
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.mp3
和good.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
【讨论】:
以上是关于使用各种扩展名重命名文件的主要内容,如果未能解决你的问题,请参考以下文章