我使用的是Linux Slackware 14.0,bash 4.2。假设我的目录中有2个文件:
bash-4.2$ ls
1.txt 2.txt
我想将它们重命名为 .svg。这个答案被接受并被投票,所以我认为,它一定有效。他使用了这个命令:
find . -name "*.andnav" -exec rename -v 's/\.andnav$/\.tile/i' {} \;
因此,我编写了类似的命令,但它打印了一个错误:
bash-4.2$ find . -name "*.txt" -exec rename -v 's/\.txt$/\.svg/i' {} \;
rename: not enough arguments
当我只想打印文件时,它可以工作:
bash-4.2$ find . -name "*.txt" -print
./1.txt
./2.txt
我知道,我可以用更简单的方法重命名:
bash-4.2$ rename .txt .svg ./*.txt
bash-4.2$ ls
1.svg 2.svg
但为什么命令不来自那回答对我有用吗?
答案1
rename
Linux 发行版上有两个命令被调用。有基本 Linux 实用程序之一,其用法如下:
rename SUBSTRING REPLACEMENT FILE...
此命令将每个指定文件中第一次出现的 SUBSTRING 替换为 REPLACMENT。它仅支持纯字符串,不支持通配符或正则表达式。在 Debian 及其衍生版本(Ubuntu、Mint 等)上,此命令称为rename.ul
.在其他 Linux 发行版上,它称为rename
.
还有一个Perl 脚本调用rename
其用法如下:
rename 'PERL CODE' FILE...
Perl 代码的常见形式是rename 's/REGEXP/REPLACEMENT/' FILE...
,它将每个文件名中第一次出现的 REGEXP 替换为 REPLACMENT(s/REGEXP/REPLACEMENT/g
替换所有出现的情况)。
作者是你看到的问题表明他正在运行 Ubuntu,因此他接受了这个答案使用rename
Ubuntu 上的命令。
标准rename
命令的类似命令是
find . -name "*.txt" -exec rename .txt .svg {} \;
当 bash ≥4 时,您可以使用**
通配符模式设置后globstar
选项匹配子目录中的文件而不使用find
.
shopt -s globstar
rename .txt .svg **/*.txt
请注意,此rename
命令作用于第一个字符串,因此如果您有一个名为 的文件hello.txt.world.txt
,它将被重命名为hello.svg.world.txt
.