3

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

我正在使用的代码将创建一个变量来保留扩展名,我正在尝试使用 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

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

4

3 回答 3

5

以下bash命令应该完成这项工作:

for f in *.*; do mv "$f" "${f%.*}"; done
于 2013-05-22T11:36:11.890 回答
4

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

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

for i in *.*

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

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

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

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

于 2013-05-22T11:37:46.757 回答
2

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

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

现在对于 abc -> a 使用 "%%" ,对于 ab,使用 "%" 如上所述

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

[[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
于 2013-05-22T11:38:24.053 回答