我有很多类似的文件xyz_123_foo.ext
,我想将其添加-bar
到末尾的文件名中以生成xyz_123_foo-bar.ext
.我试过:
rename . -bar. xyz_*
结果是:
rename: invalid option -- 'b'
接下来是用法文本。然后我尝试了各种变化,'-bar'
但"-bar"
没有成功。
我怎样才能rename
接受-
作为替换字符串的一部分?
或者另一个命令会更有效或更合适吗?
我的 shell 是 bash,我使用的rename
是util-linux
SuSe Linux SLE12 上的 shell。
答案1
mmv
非常适合像这样的任务。
mmv -n -- '*.ext' '#1-bar.ext'
或任何点扩展
mmv -n -- '*.*' '#1-bar.#2'
-n
一旦您很高兴它正在做正确的事情,请将其删除。
答案2
假设您rename
是该实用程序的 Perl 变体rename
:
rename 's/$/-bak/' xyz_*
它使用 Perl 表达式,通过替换(“行尾”锚点)简单地-bak
在所有给定文件名的末尾插入。$
你也可以使用
rename '$_ .= "-bak"' xyz_*
它使用另一个 Perl 表达式将字符串附加-bak
到$_
(Perl 中的“当前事物”,这里是文件名)。
对于 shell 循环解决方案:
for name in xyz_*; do
mv -i "$name" "$name-bak"
done
答案3
假设我们正在讨论 PERL 扩展rename
(而不是rename
from util-linux
)...
rename 's/.ext/-bar.ext/' xyz_123_foo.ext
结果将文件名更改为xyz_123_foo-bar.ext
.
单引号内的部分是 PERL 正则表达式。文件名中的s
替换为.假设这些文件位于您的主目录 ( )中,则可以将其与 结合起来。.ext
-bar.ext
find
~
find ~ -type f -name '*.ext' -exec rename 's/.ext/-bar.ext/' {} +
答案4
当使用大多数 Linux 发行版上预安装的util-linux
版本时,您可以在包含前导破折号的参数前面添加以转义它。这是默认行为。rename
--
getopt
rename '.' -- '-bar.' xyz_*