查找/重命名命令不起作用

use*_*035 8 find rename

我使用的是 Linux Slackware 14.0,bash 4.2。假设,我在目录中有 2 个文件:

bash-4.2$ ls
1.txt  2.txt
Run Code Online (Sandbox Code Playgroud)

我想将它们重命名为 .svg。这个答案被接受和赞成,所以我认为它必须有效。他使用了这个命令:

find . -name "*.andnav" -exec rename -v 's/\.andnav$/\.tile/i' {} \;
Run Code Online (Sandbox Code Playgroud)

所以,我写了类似的命令,但它打印了一个错误:

bash-4.2$ find . -name "*.txt" -exec rename -v 's/\.txt$/\.svg/i' {} \;
rename: not enough arguments
Run Code Online (Sandbox Code Playgroud)

当我只想打印文件时,它可以工作:

bash-4.2$ find . -name "*.txt" -print
./1.txt
./2.txt
Run Code Online (Sandbox Code Playgroud)

我知道,我可以用更简单的方法重命名:

bash-4.2$ rename .txt .svg ./*.txt
bash-4.2$ ls
1.svg  2.svg
Run Code Online (Sandbox Code Playgroud)

但是为什么那个答案中的命令对我不起作用?

Gil*_*il' 12

rename在 Linux 发行版上调用了两个命令。基本的 Linux 实用程序中一个,其用法如下:

rename SUBSTRING REPLACEMENT FILE...
Run Code Online (Sandbox Code Playgroud)

此命令用 REPLACEMENT 替换每个指定文件中第一次出现的 SUBSTRING。它只支持纯字符串,不支持通配符或正则表达式。在 Debian 和衍生产品(Ubuntu、Mint 等)上,此命令称为rename.ul. 在其他 Linux 发行版上,它被称为rename.

还有一个叫做 perl 的脚本rename,它的用法如下:

rename 'PERL CODE' FILE...
Run Code Online (Sandbox Code Playgroud)

Perl 代码的一种常见形式是rename 's/REGEXP/REPLACEMENT/' FILE...,它将每个文件名中第一次出现的 REGEXP 替换为 REPLACEMENT(s/REGEXP/REPLACEMENT/g替换所有出现的)。

您看到的问题的作者表示他正在运行 Ubuntu,因此他使用在 Ubuntu 上找到的命令接受了这个答案rename

标准rename命令的模拟是

find . -name "*.txt" -exec rename .txt .svg {} \;
Run Code Online (Sandbox Code Playgroud)

使用 bash ?4,您可以在设置匹配子目录中文件的选项后使用**通配符模式,而不使用.globstarfind

shopt -s globstar
rename .txt .svg **/*.txt
Run Code Online (Sandbox Code Playgroud)

请注意,此rename命令作用于第一个字符串,因此如果您有一个名为 的文件hello.txt.world.txt,它将被重命名为hello.svg.world.txt.