Bash 通配符变量替换?

Bash 通配符变量替换?

可能的重复:
批量重命名文件

我想使用现有名称作为新名称的基础来重命名文件。

所以如果我可以用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其他发行版可能提供prenamerename.pl根本不提供。

相关内容