如何通过删除扩展名重命名多个文件?


14

我有一些名为的tiff文件:

sw.001.tif
sw.002.tif
...

并且我想删除.tif每个文件末尾的。如何使用该rename命令执行此操作?


2
请记住,没有linux或unix文件系统使用Windows或VMS样式的“扩展名”-仅按惯例,文件名的后缀为“ .tif”或“ .c”或“ .o”或“ .so” “ 管他呢。
Bruce Ediger 2012年

很好...我正在将文件从Windows导入到Linux :)
Paul Paul

1
从技术上讲,Windows也不使用文件扩展名,只是Windows 95的文件管理器在脱离MS-DOS命名方案后一直使用文件名的最后一个字符来确定文件类型,并且此后一直保持约定。
RAKK

Answers:


24

perlrename(通常在Debian中也称为prename),或此衍生产品renameDebian上的软件包):

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

util-linux rename(通常在Red Hat,rename.ulDebian上找到):

rename -- .tif '' *.tif

(请注意,该名称将重命名blah.tiffany.tifblahfany.tif


2
我相信“ Debian”重命名是由Larry Wall(Perl吗?)和“ Red Hat”重命名是从util-linux(在Debian IIRC中为rename.ul)。
XTL 2012年

@XTL:是的。我之所以这样称呼他们,是因为它们是Debian或Red Hat衍生产品中的“重命名”程序。
Ignacio Vazquez-Abrams'3

非常感谢!我从没意识到有不同版本的“重命名”。我假设debian和redhat中的命令之间还有其他细微的差别。我将不得不查找它们的一些差异。
保罗

第二个命令导致语法无效,但第一个有效。
HelloWorld

6

对于非重命名,您可以执行以下操作:

$ for i in *.tif; do mv -i $i `basename $i .tif`; done

(-i警告不要替换文件)


15
更安全,更快的版本:for i in ./*.tif; do mv -i "$i" "${i%.tif}"; done
jw013 2012年

+1此处的最后一条评论。使用带空格的文件名更安全。
petobens

1
@ jw013您的评论应该是顶级答案。
罗兰

1
rename -- .oldext .newext *.oldext

这将旧扩展替换为新扩展。要简单地删除扩展名,您可以显式传递一个空字符串作为参数。

rename -- .gz.tmp  '' *.gz.tmp

使用上述命令.gz.tmp,当前文件夹中所有带有扩展名的文件都将重命名为filename.gz

请参阅文章:Linux:删除多个文件的文件扩展名以获取详细信息。


1
假设util-linux的实现renamerenamefrom中的传统命令不兼容(并且限制更大)perl
斯特凡Chazelas

另请注意,它替换了文件名中第一个出现.oldext的文件,而不一定是扩展名(foo.oldextasy.oldext将重命名为footasy.oldext)。
斯特凡Chazelas

1

如果使用IBM AIX,则没有rename命令,因此,要批量除去文件扩展名,必须使用普通的Vanilla System V UNIX命令:

for file in *.tif; do
   mv $file `echo $file | sed 's/.tif$//'`;
done;

-2

我们可以递归吗

for i in *.gz; do mv -i $i `basename $i .gz`; done
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.