更改文件扩展名

更改文件扩展名

我在文件夹中有一个 .run 文件,并尝试将其扩展名更改为 .clu。问题是我尝试过

rename 's/.run$/.clu/' *.run

但这对文件没有任何影响。

注意:我并不是想转换文件,只是想重命名扩展名。

答案1

我不知道你的问题是什么。你发布的内容有效:

$ mkdir test
$ touch test/test{01..10}.run
$ rename 's/\.run$/.clu/' test/*.run -vn
test/test01.run renamed as test/test01.clu
test/test02.run renamed as test/test02.clu
test/test03.run renamed as test/test03.clu
test/test04.run renamed as test/test04.clu
test/test05.run renamed as test/test05.clu
test/test06.run renamed as test/test06.clu
test/test07.run renamed as test/test07.clu
test/test08.run renamed as test/test08.clu
test/test09.run renamed as test/test09.clu
test/test10.run renamed as test/test10.clu

-vn只是告诉我们如果没有它会发生什么。

我正在转义点(否则它将是 REGEX“任何东西”),但这实际上没有什么区别。没有它也可以正常工作。


您是否真的在运行rename.ul?请检查是否正在使用 Perl 重命名(采用我们正在使用的语法)dpkg -S $(readlink -f $(which rename))

  • perl: /usr/bin/prename很好。
  • util-linux: /usr/bin/rename.ul很糟糕。出于某种原因,您使用的是功能非常有限的重命名版本。发生了一些非常棘手的事情。

目前,看看是否prename存在(您现在可以使用它),如果不存在,则开始询问为什么 Perl 没有正确安装。这表明您没有安装 Ubuntu。

或者,如果您乐意使用rename.ul,则以下内容应该有效:

rename.ul .run .clu *.run

但这可能会吞噬文件,test.run.hooray.runtest.clu.hooray.clu显然不是很好。

答案2

你不需要需要可以使用rename以下方法。你可以使用basename

for f in *run; do mv "$f" "$(basename "$f" .run)".clu; done

basename将打印文件的名称(无路径)并删除可选后缀。因此,"$(basename "$f" .run)".clu是文件的名称$f.run扩展名被替换为clu

你也可以使用 bash 自己的字符串操作功能

for f in *run; do echo mv "$f" "${f%%.run}".clu; done

该构造从变量的末尾${var%%string}删除字符串。string$var

答案3

在这种情况下我更喜欢的是mmv(它在 Ubuntu 中默认未安装,但您可以使用sudo apt-get install mmv命令安装它):

mmv -n '*.run' '#1.clu'

-n意味着这是一次测试运行,实际上不会更改任何文件。它将向您显示如果删除 则将被重命名的文件列表-n。在上述情况下,它将当前目录中的所有文件的文件扩展名从 转换.run.clu

mmv -v '*.run' '#1.clu'

-v是可选的,但最好将其包括在内,因为它是重命名命令所做更改的唯一记录。

man mmv了解更多信息。

答案4

你只需使用mv

mv oldname newname

mv用于移动/重命名文件。有关详细信息,请参阅 mv 的手册页。

相关内容