我想对以下结构中的几个文件夹进行排序。
例如:
/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”进行测试。