如何将所有子目录中包含的文件移动到当前目录,然后删除空子目录?
我发现这个问题,但将答案调整为:
mv * .
没有用;我收到了很多类似的警告:
mv: wil and ./wil are identical
子目录中包含的文件具有唯一的名称。
答案1
您还可以使用以下-mindepth
选项:
find . -type f -mindepth 2 -exec mv -i -- {} . \;
(同时-maxdepth
您还可以限制收集文件的层次结构级别。)
我使用mv -i
(“interactive”)在覆盖文件之前进行mv
询问。如果有很多子目录,可能会出现名称冲突,您需要收到警告。
该--
选项停止选项处理,因此mv
不会被以连字符开头的文件名混淆。
使用以下命令清理所有空子目录
find . -depth -mindepth 1 -type d -empty -exec rmdir {} \;
答案2
mv */* .
它会将所有子目录中的所有文件移动到当前目录。
如果你需要清理,你可以使用
find . -type d -empty -delete
它将删除所有空子目录。
答案3
尝试这个:
find ./*/* -type f -print0 | xargs -0 -J % mv % .
更多信息:单独尝试 find-stamement,它应该会为您提供要移动的所有文件的列表(省略-print0
)。例如:
probe:test trurl$ find ./*/* -type f
./test_s/test_s_s/testf4
./test_s/test_s_s/testf5
./test_s/testf1
./test_s/testf2
./test_s/testf3
./test_s2/testf6
./test_s2/testf7
使用-print0
,xargs
现在您正在创建要执行的语句列表。-J %
标志表示在此处插入列表元素,因此mv $FILE .
对于找到的每个文件都会执行。
以上适用于 BSD xargs。如果你使用的是 GNU 版本 (Linux),请-I %
使用-J %
答案4
1 个快速技巧,仅当您的文件具有扩展名(带点)时才有效:
mv *.* subdir/
mv .* subdir/