这可能相当简单,但是,在不遵循符号链接和将冲突目录的内容合并在一起的情况下,将基目录下所有名为“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
已在脚本中重定向。
我使用引号来允许任何路径元素中有空格,包括A
和B
。
我尝试测试了不同的层次结构,但我不能确定我是否涵盖了您可能使用的所有结构。我建议您先将命令放在和命令echo
之前,直到您确认该命令可以执行您想要的操作。mv
rmdir