【问题标题】:How to use find and prename to reformat directory names recursively?如何使用 find 和 prename 递归地重新格式化目录名称?
【发布时间】:2021-04-06 17:01:29
【问题描述】:

我正在尝试查找括号中以年份开头的所有目录,例如:

[1990] Nature Documentary

然后重命名它们,去掉括号并在中间插入一个破折号。

1990 - Nature Documentary

下面的find 命令似乎找到了结果,但是我不能在模式前面加上^ 来标记目录名称的开始,否则它不会返回命中。

我很确定我需要使用-exec-execdir,但我不确定如何存储找到的模式并对其进行操作。

find . -type d -name '\[[[:digit:]][[:digit:]][[:digit:]][[:digit:]]] *'

【问题讨论】:

  • 这是一个全局,而不是正则表达式。而且您不需要将其锚定到开头,因为如果匹配是部分匹配,-name primary 不会评估为 true。

标签: shell find rename


【解决方案1】:

你可以使用重命名命令

find . -type d -name '\[[[:digit:]][[:digit:]][[:digit:]][[:digit:]]\] *'| rename -n 's/(\[\d{4}\]) ([\w,\s]+)+$/$1 - $2/'

注意:只有删除-n选项后才会生效。

【讨论】:

    【解决方案2】:

    [p]rename:

    -depth -exec prename -n 's/\[(\d{4})]([^\/]+)$/$1 -$2/' {} +
    

    如果输出看起来不错,请删除 -n

    没有它,你需要一个带有几个难以理解的参数扩展的 shell 脚本:

    -depth -exec sh -c '
    for dp; do
      yr=${dp##*/[} yr=${yr%%]*}
      echo mv "$dp" "${dp%/*}/$yr -${dp##*/\[????]}"
    done' sh {} +
    

    删除 echo 以应用更改。

    【讨论】:

      猜你喜欢
      • 2020-08-16
      • 2011-06-15
      • 2023-03-29
      • 2017-08-25
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      相关资源
      最近更新 更多