Bash 重命名包括括号在内的所有文件(
我有一个目录,里面有很多文件,其中一些文件有括号;例如Bash 重命名包括括号在内的所有文件(,bash,shell,quoting,Bash,Shell,Quoting,我有一个目录,里面有很多文件,其中一些文件有括号;例如a(file).ext,a(other)file.ext,等等。我的目标是将它们重命名为这样的内容:a_ufile.ext或a?other?file.ext(不管是什么字符) 这是因为某些控制台应用程序无法处理这些括号,并且认为这是某种命令 我已经尝试过的事情: $ rename ( ? *(* $ for f in *(*; do mv $f ${f//(/?}; done $ for f in "*(*"; do mv $f ${f//\
a(file).ext
,a(other)file.ext
,等等。我的目标是将它们重命名为这样的内容:a_ufile.ext
或a?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)
和(
是语法,需要转义才能明确地称为文本)
- 如果没有文件匹配,设置
选项将使glob完全展开为零,而不是自身。将代码放入子shell可防止此配置更改在单个命令之外持续nullglob
- 如果您不希望这些扩展受到字符串拆分和全局化的影响,则必须在扩展周围使用引号
(shopt -s nullglob; for f in *[\(\)]*; do mv "$f" "${f//[()]/_}"; done)
和(
是语法,需要转义才能明确地称为文本)
- 如果没有文件匹配,设置
选项将使glob完全展开为零,而不是自身。将代码放入子shell可防止此配置更改在单个命令之外持续nullglob
- 如果您不希望这些扩展受到字符串拆分和全局化的影响,则必须在扩展周围使用引号
?
。这里有一堆错误源于缺少/不充分的引用…说到这里,如果你不小心引用,你绝对不应该在你的文件名中使用?
s。我将添加我通常推荐的mv-I
或mv-n
,以避免在名称冲突时意外覆盖文件;否则,看起来不错!我应该在之后使用'shopt-u nullglob'来取消设置吗?@konelix,你不需要这样做,因为存在子shell。Paren论文告诉shell放弃一个自身的副本,并在该副本中运行附带的代码;当子shell结束时,对变量、设置和其他进程本地状态的更改就会消失。我将添加我对mv-I
或mv-n
的常用建议,以避免在出现名称冲突时意外覆盖文件;否则,loo很好!我应该在之后使用'shopt-u nullglob'来取消设置吗?@konelix,您不需要这样做,因为子shell的存在。括号告诉shell分叉一个自身副本并在该副本中运行附带的代码;当子shell结束时,对变量、设置和其他进程本地状态的更改就会消失。