将所有文件从子目录移动到当前目录?

将所有文件从子目录移动到当前目录?

如何将所有子目录中包含的文件移动到当前目录,然后删除空子目录?

我发现这个问题,但将答案调整为:

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

使用-print0xargs现在您正在创建要执行的语句列表。-J %标志表示在此处插入列表元素,因此mv $FILE .对于找到的每个文件都会执行。

以上适用于 BSD xargs。如果你使用的是 GNU 版本 (Linux),请-I %使用-J %

答案4

1 个快速技巧,仅当您的文件具有扩展名(带点)时才有效:

mv *.* subdir/
mv .* subdir/

相关内容