重命名所有文件,包括括号 (

Rename all files including a bracket (

我有一个目录,里面有很多文件,其中一些文件中有括号;例如a(file).extan(other)file.ext 等。我的目标是将它们重命名为这样的名称:a_file_.extan?other?file.ext。 (什么角色无关紧要)。

这是因为某些控制台应用程序无法处理这些括号,并认为这是某种命令。

我已经尝试过的事情:

$ rename ( ? *(*
$ for f in *(*; do mv $f ${f//(/?}; done
$ for f in "*(*"; do mv $f ${f//\"(\"/\"?\"}; done

之类的。 可能是我不理解这些重命名函数。 (我知道这些只适用于“(”,我必须为“)”再做一次) 那么有人可以就它的语法以及为什么它不起作用给出更多解释吗?

全在Bash.

考虑:

(shopt -s nullglob; for f in *[\(\)]*; do mv "$f" "${f//[()]/_}"; done)
  • () 是语法,需要转义才能明确称为文字。
  • 如果没有文件匹配,设置 nullglob 选项会使 glob 完全展开,而不是它本身。将代码放在子 shell 中可以防止此配置更改在单个命令之外持续存在。
  • 如果您不希望这些扩展受到字符串拆分和通配的影响,则必须在扩展周围使用引号。