如何删除除顶级数字目录之外的所有内容?

如何删除除顶级数字目录之外的所有内容?

我想删除某个目录下的所有内容/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)包含隐藏文件(Dot 文件)的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

相关内容