如何在Linux/Unix中将多个文件从一个扩展名重命名为另一个扩展名?

9

我有一些以 '.1' 结尾的文件,例如:

example.file.ex1.1
example.file.ex2.1
example.file.ex3.1

有没有一种方法可以快速地将它们全部重命名,而不带有结尾的“.1”(例如:example.file.ex1,example.file.ex2等)?
谢谢!

3
这个问题似乎不适合此处讨论,更适合 Unix&Linux - Luc M
2
尝试过了,但显然我没有足够的“声望”。=) - user2716340
找到名字为".ex.1"的文件,并执行sh命令,将"$1"移动到"$(echo "$1" | sed s/.1$//)"。 - Paschalis
3个回答

13

好的,请尝试使用rename

rename -n 's/\.1$//' *

如果您的测试有效,请删除-n(干运行模式开关)。

warning 存在其他同名工具,可能能够实现此功能,但也可能不行,所以请小心。


如果您运行以下命令 (linux

$ file $(readlink -f $(type -p rename))

然后你会得到这样的结果:

.../rename: Perl script, ASCII text executable

那么这似乎是正确的工具 =)

如果不是,要将其设置为默认值(通常已经是如此)在 Debian 和类似 Ubuntu 的派生版本上:

$ sudo update-alternatives --set rename /path/to/rename

最后但并非最不重要的,这个工具最初是由Perl之父Larry Wall编写的。


你能解释一下为什么默认的“rename”在Ubuntu或Debian上不起作用吗?似乎运行“/usr/bin/rename -n 's/.1//' *”对我有效,而默认的“rename”则无效。我真的不明白,两者都允许使用perl表达式,但一个有效而另一个无效。有什么区别吗? - Aleks-Daniel Jakimenko-A.
然而,有时我在某些Debian/Ubuntu上遇到的rename程序完全不同... - Antti Haapala -- Слава Україні
因此,我的解释将有助于使Perl成为默认选项。 - Gilles Quénot

5

纯bash解决方案:

for curFile in example.file.*.1; do
    mv -- "$curFile" "${curFile:0:-2}"
done

3

使用参数扩展的另一个解决方案:

for curFile in example.file.*.1; do
    mv "$curFile" "${curFile%.1}"
done

谢谢!它有效: f=file.zip; echo ${f%.zip} # --> file - Michal Čizmazia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接