递归删除所有文件和文件夹,但不包括一个文件夹
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
粗略翻译,这意味着:find
在 my-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
。
我有这样的文件夹结构:
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
粗略翻译,这意味着:find
在 my-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
。