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)
我继承了如下所示的结构,这是多年意大利式代码的结果...
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)