从目录中的所有文件中删除特定扩展名

从目录中的所有文件中删除特定扩展名

我有几个扩展名为“.old”的文件。
如何在不删除文件的情况下删除“.old”扩展名?

我可以手动完成,但需要更多工作:

mv file1.key.old file1.key
mv file2.pub.old file2.pub
mv file3.jpg.old file3.jpg
mv file4.jpg.old file4.jpg

(etc...)

该命令也可以与其他扩展一起使用吗?

例子:

mv file1.MOV.mov file1.MOV
mv file2.MOV.mov file2.MOV
mv file3.MOV.mov file3.MOV

(etc...)

或更好:

mv file1.MOV.mov file1.mov
mv file2.MOV.mov file2.mov
mv file3.MOV.mov file3.mov

(etc...)

答案1

使用bash的参数替换机制删除匹配的后缀模式:

for file in *.old; do
    mv -- "$file" "${file%%.old}"
done

答案2

您没有说明您正在使用什么操作系统,但许多 Linux 发行版都有一个rename可以用于此目的的命令。实际上有两个完全不同的rename命令 - Debian 和类似的系统提供一个命令,而 RedHat 和类似的系统提供另一个命令 - 但任何一个都可以在这里工作。

rename基于 Debian、Ubuntu 等的Perl ,请参阅:名称手册

Redhat 上的Util-Linuxrename等,请参阅:重命名手册

在 Debian 和类似的系统上你可以这样做:

rename 's/\.old$//' *

或者:

rename s/.MOV.mov/.mov/ *.*

在 Redhat 和类似平台上你可以这样做:

rename .old "" *

答案3

有很多多重重命名工具,例如http://file-folder-ren.sourceforge.net/

但我认为重命名最快的方法是一个简单的脚本,例如:

for i in *.old
do
   mv -- "$i" "${i%.old}"
done

请注意,没有错误检查,如果目标文件存在,则可能会被覆盖。

答案4

如果您想将答案限制为 shell (Bash) 编程(而不是使用重命名工具),请尝试以下操作:

for oldname in *.old ; do
    newname="${oldname%%.old}"
    if [ -e "$newname" ] ; then
        echo "Cannot rename $oldname because $newname exists." >&2
    else
        mv -- "$oldname" "$newname"
    fi
done

$oldname我在and周围使用引号,$newname因为文件名可以包含空格。

相关内容