可能的重复:
批量重命名文件
我想使用现有名称作为新名称的基础来重命名文件。
所以如果我可以用ls
这些文件
ls blue*+(.png)
我想将它们重命名为
mv blue$(*)+(.png) $(1).png
但这显然不起作用。 bash globbing 中是否有此类变量的语法或者是否有更简单的方法?
答案1
实现此目的的便携方法是
for f in blue*.png; do mv -- "$f" "${f#blue}"; done
mv
所有这一切不仅需要bash
并且可以在任何支持 POSIX 兼容的 shell中运行标准 POSIX 参数扩展。您的系统无需安装zsh
特定版本rename
。
答案2
我没有看到任何简单的方法可以在 bash 中执行此操作,但是当然您可以将问题分解为几个步骤,例如删除前缀、记住扩展名,然后用单个扩展名替换扩展名的多个实例。
for file in blue*+(.png); do tmp="${file#blue}"; extension="${file##*.}"; echo "$file" "${tmp/%+(.$extension)/}.$extension";done
如果您对结果感到满意,只需输入...
^echo^mv
所有的魔法都会发生。 :)
答案3
使用bash:
zsh -c '
autoload -U zmv
zmv "blue(*).png" "\$1.png"'
;-)。或者更认真地说,您会发现 zsh 的 zmv 是一个非常强大的工具,可用于各种重命名作业。与您可能想出的脚本相反,该工具(或专用于 mmv 或重命名等任务的任何其他工具)会格外小心,不要破坏文件,并且在极端情况下更有可能更加健壮。
答案4
在 Debian 及其衍生版本(包括 Ubuntu)上,有一个重命名命令可以执行您想要的操作:
rename -n "s/\+\.png/.png/" blue*+.png
测试后删除 -n 标志以实际应用重命名。
该命令是一个 Perl 脚本,不要与util-linux 套件中的命令rename
混淆。rename
其他发行版可能提供prename
或rename.pl
根本不提供。