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

Ric*_*ard 22 bash mv folder-redirection

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

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

mv * .
Run Code Online (Sandbox Code Playgroud)

不工作; 我收到了很多警告,如下所示:

mv: wil and ./wil are identical
Run Code Online (Sandbox Code Playgroud)

子目录中包含的文件具有唯一名称。

Flo*_*enn 33

您还可以使用该-mindepth选项:

find . -type f -mindepth 2 -exec mv -i -- {} . \;
Run Code Online (Sandbox Code Playgroud)

(与-maxdepth您一起还可以限制从中收集文件的层次结构级别。)

我使用mv -i(“交互式”)mv在覆盖文件之前询问。对于很多子目录,您可能会希望收到警告的名称冲突。

--选项会停止选项处理,因此mv不会被以连字符开头的文件名混淆。

清理整堆空子目录

find . -depth -mindepth 1 -type d -empty -exec rmdir {} \;
Run Code Online (Sandbox Code Playgroud)

  • mv 的选项:`-n, --no-clobber`:不覆盖现有文件。您可能也对 `-b, --backup` 感兴趣。 (3认同)

小智 8

mv */* .
Run Code Online (Sandbox Code Playgroud)

它将把所有子目录中的所有文件移动到当前目录。

如果您需要一些清理,您可以使用

find . -type d -empty -delete
Run Code Online (Sandbox Code Playgroud)

它将删除所有空子目录。


tru*_*url 5

尝试这个:

find ./*/* -type f -print0 | xargs -0 -J % mv % .
Run Code Online (Sandbox Code Playgroud)

更多信息:单独尝试 find-stament,它应该会给你一个包含你想要移动的所有文件的列表(省略-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
Run Code Online (Sandbox Code Playgroud)

with-print0并且xargs您现在正在创建要执行的语句列表。该-J %标志的意思是,在此处插入列表元素,因此mv $FILE .对找到的每个文件都会执行。

以上适用于 BSD xargs。如果您使用的是 GNU 版本 (Linux)-I %代替-J %