递归删除所有文件和文件夹,但不包括一个文件夹

Delete all files and folders recursively but excluding one folder

我有这样的文件夹结构:

my-root-folder
├── .git
├── README.md
├── index.css
├── index.js
├── index.html
├── assets
│   ├── image
│   │   ├── logo.jpg
│   │   ├── header.jpg

我想删除 my-root-folder 中的所有文件和文件夹,但不删除 .git 文件夹 (./my-root-folder/.git) 和他的 child.

我试过这个命令,但总是删除所有:

shopt -s extglob && rm -rf ./* !(".git")

旁注我在基于高山的 docker 图像中。

你可以试试 find:

find my-root-folder -mindepth 1 -not -path "*/.git*" -delete

粗略翻译,这意味着:findmy-root-folder 中的所有 at least one level deep(因此,排除文件夹本身)not 匹配谓词 path contains "/.git"delete 它。

注意参数".git"实际上是一个正则表达式,所以在适配其他情况时要小心。 find 是一个非常强大和有用的工具,所以一定要查看它的文档!

此查找命令也删除嵌套的 .git :

find .  -mindepth 1 -path ./.git -prune -o -exec echo rm -rf {} \;

-path ./.git -prune -o 仅排除顶级 .git

一个缺点是您可能会看到消息,因为 find 试图访问它已经删除的目录。

一旦满意就删除echo