如何使用 find 和 prename 递归地重新格式化目录名称?

How to use find and prename to reformat directory names recursively?

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

[1990] Nature Documentary

然后重命名它们,删除括号并在中间插入破折号。

1990 - Nature Documentary

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

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

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

您可以使用重命名命令

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

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

[p]rename:

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

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

没有它,您将需要一个 shell 脚本,其中包含几个难以理解的参数扩展:

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

删除 echo 以应用更改。