MV 子目录上一级但不至根目录

MV 子目录上一级但不至根目录

我想对以下结构中的几个文件夹进行排序。

例如:

/root/sub1/aaaa/bbbb/cccc/dddd
/root/sub2/aaaa/bbbb/cccc/dddd
/root/sub3/aaaa/bbbb/cccc/dddd
/root/sub4/aaaa/bbbb/cccc/dddd

这些是嵌套文件夹,除了下一个文件夹外,其中没有任何内容。

我想切断通往此的道路

/root/sub1/dddd
/root/sub2/dddd
/root/sub3/dddd
/root/sub4/dddd

我不想将文件夹移动到根级别文件夹,而是移动到其父文件夹的正下方。

我认为运行的最佳命令是:

mv sub*/aaaa/bbbb/cccc/dddd

然而,这会将一切带回到根层面。

或者我可以在每个子文件夹中运行命令,但这仍然很乏味。

mv aaaa/bbbb/cccc/dddd

答案1

由于文件需要最终位于不同的目录中,因此您需要运行mv多次,每个目标目录至少运行一次。你可以通过运行来做到这一点mv一点for循环

for x in /root/*
do
  mv -i "$x"/*/*/*/* "$x"
done

依次mv对目录中的每个条目执行循环体(命令)。/root每次运行循环体时,"$x"都会被路径 替换/root/subN。该命令mv -i "$x"/*/*/*/* "$x"将文件移动/root/sub1/aaaa/bbbb/cccc/dddd到目录/root/sub1,即文件移动到/root/sub1/dddd

使用选项-i,将询问目标文件是否已存在,如果您同时拥有和 ,mv则可能会发生这种情况。/root/sub1/aaa1/bbb/ccc/ddd/root/sub1/aaa2/bbb/ccc/ddd

答案2

find /root -maxdepth 6 -mindepth 6 -type d | awk -F \/ '{ print "mv "$0" "$1"/"$2"/"$3"/"$6 }' | sh

使用 find 命令,特别强调最大和最小目录深度,然后获取列表并通过 awk 解析以构建我们可以使用 sh 执行的 mv 命令。在添加执行之前删除“| sh”进行测试。

相关内容