我在文件夹中有一个 .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.run
这test.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 的手册页。