Linux/shell - 从一个目录中删除所有(子)子文件夹,一个除外

Linux/shell - Remove all (sub)subfolders from a directory except one

我继承了如下所示的结构,这是多年意大利式代码的结果...

gallery
├── 1
│   ├── deleteme1
│   ├── deleteme2
│   ├── deleteme3
│   └── full
│       ├── file1
│       ├── file2
│       └── file3
├── 2
│   ├── deleteme1
│   ├── deleteme2
│   ├── deleteme3
│   └── full
│       ├── file1
│       ├── file2
│       └── file3
└── 3
    ├── deleteme1
    ├── deleteme2
    ├── deleteme3
    └── full
        ├── file1
        ├── file2
        └── file3

实际上,这个文件夹有数千个子文件夹。我只需要保留 ./gallery/{number}/full/*(即 full 文件夹和其中的所有文件,来自 gallery 中每个编号目录),其他所有内容不再需要,需要删除。

是否可以构造一个单线来处理这个问题?我试过 find/maxdepth/prune 找不到满足我需要的编排。

(更新:澄清一下,所有文件夹都包含文件 - none 是空的)

怎么样:

find . -type d -empty -delete

使用 PaddyD answer 你可以先清理不需要的目录然后删除它们:

find . -type f -not -path "./gallery/*/full/*" -exec rm {} + && find . -type d -empty -delete

这可以通过 bash extglobs 轻松完成,它允许匹配所有不匹配模式的文件:

shopt -s extglob
rm -ri ./gallery/*/!(full)