我想删除某个目录下的所有内容/path/to/foo
,除了那些与元模式匹配的子目录
/path/to/foo/<DIGITS>/
例如,如果下面的内容/path/to/foo
最初是这样的:
/path/to/foo
├── 0/
│ ├── a
│ └── b
├── 232532/
├── 42
├── 73/
│ ├── d
│ └── e
├── 8xyz/
│ ├── i
│ └── j
├── _bar/
│ ├── x
│ ├── y
│ └── z
├── .baz/
│ ├── f
│ └── frobozz/
│ ├── g
│ └── h
└── quux/
└── 123/
...我想结束
/path/to/foo
├── 0/
│ ├── a
│ └── b
├── 232532/
└── 73/
├── d
└── e
我正在寻找一个find ... -delete
基于 - 的咒语,或一个合适的zsh
全局模式(for rm -r
),可以做到这一点。我正在使用Linux。
答案1
和zsh
:
set -o extendedglob # best in ~/.zshrc
rm -rf /path/to/foo/^<->(D) /path/to/foo/<->(^-/)
^something
是不是某事(类似于ksh
的!(something)
)<->
是<x-y>
匹配从x
到 的十进制整数y
,但不提供任何边界(因此匹配任何十进制数字序列,类似于ksh
's+([0-9])
)。(D)
包含隐藏文件(D
ot 文件)的glob 限定符(^-/)
一个全局限定符仅在符号链接解析后不属于目录类型的文件(-
如果您还想删除目录的符号链接,请删除 )。
答案2
如果您有权访问 GNU find
,您可以运行:
find . -maxdepth 1 -not \( -type d -regex '.*/[0-9]*$' \) -exec rm -r {} +
这个想法是找到那些不是 i) 目录和 ii) 其名称仅由数字组成的顶级文件。
我强烈建议您运行一次,echo
而不是rm -r
看看它会做什么。
答案3
cd /path/to/foo && \
find . -maxdepth 1 ! -type d -delete -o \
! -name . -name '*[!0-9]*' -exec rm -rf {} +
内容如下:
- 切换到 /path/to/foo 目录并成功进入该目录
- 调用
find
仅深入一层并删除其中的所有非目录。 - 对于所有其他子目录,即 /path/to/foo 目录中的子目录,拒绝那些名称为“.”的子目录,并选择其中至少包含一个非数字的子目录。
- 然后将选定的目录引导至屠宰场,从而确保仅数字目录的生存。
答案4
find ./* ! \( -type d -regex "./[0-9]+\(/.*\)?" \) -delete
或者,如果foo
文件太多并且发生参数限制超出,请使用:
find . ! -path . ! \( -type d -regex "./[0-9]+\(/.*\)?" \) -delete