我有大量文件打包到一个两级目录结构中,其中有很多很多文件夹。
换句话说,我有一个文件夹,里面有很多子文件夹。这些子文件夹中没有子文件夹,但是其中有数百个文件。
我想做的是将所有文件从这些子文件夹移到保存子文件夹的目录中。
这是一个资源有限的系统,因此如果不需要同时存在所有这些文件的两个副本,那就太棒了……
答案1
使用 GNU 工具:
cd that-dir &&
find . -mindepth 2 ! -type d -exec mv -it . {} +
答案2
进入父目录并运行
mv -- */* .
(--
仅当存在名称以 开头的子目录时才需要-
)
如果子目录中有以.
(点文件) 开头的文件,或者名称以 开头的子目录.
,则还需要移动它们:
mv -- */* */.[!.]* */..?* .
mv -- .[!.]*/* .[!.]*/.[!.]* .[!.]*/..?* .
mv -- ..?*/* ..?*/.[!.]* ..?*/..?* .
确保不存在冲突,否则您移动的最后一个文件将默默地覆盖先前移动的同名文件。将选项传递-i
给mv
(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 . {} +