批量重命名/合并多个目录

批量重命名/合并多个目录

这可能相当简单,但是,在不遵循符号链接和将冲突目录的内容合并在一起的情况下,将基目录下所有名为“A”的目录递归重命名为“B”的最佳方法是什么?也就是说,如果“B”目录已经存在,则应将“A”的内容移动到“B”,并删除空的“A”目录。

答案1

没有一个程序可以执行重命名/合并功能,但mv ... -t ...如果可以更轻松地在find命令中使用它会很有帮助。所以我设计的是:

find BaseDir/ -type d -name "A" | sort -r | while read d; \
     do [ -d "${d%A}B" ] && mv "$d"/* "${d%A}B"/ && rmdir "$d" || \
         mv "$d" "${d%A}B"; done

这样做的目的是:-

  • 查找所有名为 的目录A
  • 反向排序,例如,BaseDir/A/A将在之前重命名BaseDir/A:如果后者先被重命名,则前者随后将不会被找到。
  • 逐一检查找到的每个目录:如果B不存在,则进行简单的重命名;否则,内容A移至B并且现在为空的A可以被删除。

请注意,如果B预先存在,它包含的任何文件将被 中具有相同名称的文件覆盖A:您可能需要添加额外的命令来防止这种情况 - 您可以使用mv -i,但您需要重新建立终端以进行任何提示(例如mv </dev/stdin -i ...,或您的Linux支持的任何内容),因为stdin已在脚本中重定向。

我使用引号来允许任何路径元素中有空格,包括AB

我尝试测试了不同的层次结构,但我不能确定我是否涵盖了您可能使用的所有结构。我建议您先将命令放在和命令echo之前,直到您确认该命令可以执行您想要的操作。mvrmdir

相关内容