我有一个目录,里面装满
了很多文件,其中一些文件有括号;例如 a(file).ext
、an(other)file.ext
等我的目标是将它们重命名为这样的东西: a_file_.ext
或 an?other?file.ext
.(什么角色无关紧要(。
的原因是某些控制台应用程序无法处理这些括号,并认为这是某种命令。
我已经尝试过的事情:
$ rename ( ? *(*
$ for f in *(*; do mv $f ${f//(/?}; done
$ for f in "*(*"; do mv $f ${f//"("/"?"}; done
等等。可能是我不了解这些重命名功能。(我知道这些仅适用于"(",并且我必须再次为"(执行它们"(那么有人也可以对它的语法以及为什么它不起作用给出更多解释吗?
一切都在巴什。
考虑:
(shopt -s nullglob; for f in *[()]*; do mv "$f" "${f//[()]/_}"; done)
-
(
和)
是语法,需要转义才能明确地称为文字。 - 如果没有匹配的文件,设置
nullglob
选项会使 glob 完全展开为空,而不是自身。将代码放在子 shell 中可防止此配置更改持续到单个命令之后。 - 如果您不希望扩展受到字符串拆分和通配,则必须在扩展周围使用引号。