我有几个扩展名为“.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
因为文件名可以包含空格。