递归地将文件夹重命名为@eaDir

递归地将文件夹重命名为@eaDir

我正在尝试使用我在 GitHub 上找到的缩略图生成器 python 脚本,效果非常好。

它会在名为 的文件夹中生成缩略图eaDir_temp,然后需要在 NAS 上将其重命名为@eaDir来自终端。作者为此提供了一个命令:

find . -type d -name 'eaDir_tmp' -exec mv '{}' @eaDir \;

不幸的是,对于每个包含照片的子文件夹,它返回:

mv: cannot move ‘./subfolder/eaDir_tmp’ to ‘@eaDir/eaDir_tmp’: Directory not empty

我该怎么办?

答案1

对于好奇的人来说,可能会发生什么:命令

find . -type d -name 'eaDir_tmp' -exec mv '{}' @eaDir \;

将它找到的每个./whatever/eaDir_tmp目录(即组件eaDir_tmp)移动到当前工作目录:./whatever/eaDir_tmp./@eaDir。 (因为@eaDir被视为mv相对于当前工作目录的路径组件)。

第一次,./@eaDir如果尚不存在,则会创建 。

第二个./whatever/eaDir_tmp找到的已移动进入 ./@eaDir,因为此时给定mv( )的目标目录已存在: → 。@eaDir./whatever/eaDir_tmp./@eaDir/eaDir_tmp

进一步找到也./subfolder/eaDir_tmp移入,这一步失败,因为已经存在且不为空。./@eaDir./@eaDir/eaDir_tmp


您可以做什么:如果您的find实施支持该-execdir操作:

find . -depth -type d -name 'eaDir_tmp' -execdir mv '{}' @eaDir \;

-depth实际上仅在嵌套目录的情况下才需要eaDir_tmp(例如./whatever/eaDir_tmp/whatever/eaDir_tmp)。

与 相反-exec-execdir从包含匹配文件的目录(而不是从 的find当前工作目录)运行指定的命令。

如果您find不支持非标准-execdir

find . -depth -type d -name 'eaDir_tmp' \
  -exec sh -c 'mv "$1" "${1%/*}/@eaDir"' mysh {} \;

或者,避免为每个找到的目录启动 shell:

find . -depth -type d -name 'eaDir_tmp' -exec sh -c '
  for dir
  do
    mv "$dir" "${dir%/*}/@eaDir"
  done' mysh {} +

相关内容