我有一个大型的 n 级目录,结构如下:
root
|
subdir1
|
sub_subdir1
|
....(n-2 levels).....
|
file1
|
subdir2
|
sub_subdir2
|
....(n-2 levels).....
|
file2
我想展平目录,以便所有 1 级子目录都包含文件。我还想将 2 级删除到 (n-1) sub_subdirs,因为它们不包含文件。请注意,子目录都有不同的名称。
期望的结果
root
|
subdir1
|
file1
|
subdir2
|
file2
我发现很多帖子解释了展平目录的方法,但没有一个解释如何以受控方式执行此操作,即
- 通过指定要展平的级别
- 或对根目录中的所有子目录递归执行
使用 zsh:
这个:
subdir*
(再次来自您的示例:匹配 subdir1 和 subdir1)**
递归 globbing 特性,然后受 glob 限定符的限制*(.)
,它表示:此目录中的任何条目都是纯文件*(/)
,它表示匹配目录条目。在 bash 中,执行以下操作:
这会查看“
root
”中的所有内容,包括点文件。如果您不需要查看点文件,请忽略shopt -s dotglob
. 警告:不要 在命令中添加.*
或。root/.*
for
正如 Jeff 所建议的那样
/
,glob ( ) 末尾的仅获取子目录,因此我们不需要测试每个子目录(例如,使用 )。root/*/
if
对于 的每个子目录,
root
找到该子目录中及其下的所有文件并将它们移动到子目录中。用于-i
防止覆盖文件(例如,如果您有多个名为file1
分布在 下的文件subdir1
)。-i
表示“交互式”,它会询问您是否应该覆盖现有文件。请注意,即使您说“是” ,它也可能拒绝这样做。如果您的版本mv
不支持该-t
选项,请将mv
命令替换为然后删除顶层子目录下的所有子目录。请注意,如果未移动任何文件,此 (
find
... ) 将失败。-delete
这部分受到derobert 对 Flattening a nested directory的回答的启发。