如何使用命令行(或脚本)剥离目录结构

如何使用命令行(或脚本)剥离目录结构

我有大量文件打包到一个两级目录结构中,其中有很多很多文件夹。

换句话说,我有一个文件夹,里面有很多子文件夹。这些子文件夹中没有子文件夹,但是其中有数百个文件。

我想做的是将所有文件从这些子文件夹移到保存子文件夹的目录中。

这是一个资源有限的系统,因此如果不需要同时存在所有这些文件的两个副本,那就太棒了……

答案1

使用 GNU 工具:

cd that-dir &&
  find . -mindepth 2 ! -type d -exec mv -it . {} +

答案2

进入父目录并运行

mv -- */* .

--仅当存在名称以 开头的子目录时才需要-

如果子目录中有以.(点文件) 开头的文件,或者名称以 开头的子目录.,则还需要移动它们:

mv -- */* */.[!.]* */..?* .
mv -- .[!.]*/* .[!.]*/.[!.]* .[!.]*/..?* .
mv -- ..?*/* ..?*/.[!.]* ..?*/..?* .

确保不存在冲突,否则您移动的最后一个文件将默默地覆盖先前移动的同名文件。将选项传递-imv(ie mv -i */* .) 以在发生冲突时进行提示。

然后您可以删除子目录:

rmdir */

如果您收到一条错误消息,告诉您命令行太长,则必须分几个步骤来完成。最简单的方法是使用find命令:

find */ -type f -exec mv -i {} . \;

或者,稍微快一点:

find */ -type f -exec sh -c 'mv -i -- "$@" "$0"' . {} +

在非嵌入式 Linux 系统上甚至更快:

find . -mindepth 2 -type f -exec mv -it . {} +

相关内容