Удалить все файлы и папки рекурсивно, но исключая одну папку - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть структура папок, подобная этой:

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) и его дочерний элемент.

Я пробовал с этой командой, но всегда удаляю все:

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

Примечание: я нахожусь в docker изображении, основанном на альпийском.

Ответы [ 2 ]

2 голосов
/ 01 апреля 2020

Вы можете попробовать с 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 it.

Обратите внимание, что аргумент ".git" на самом деле является регулярным выражением, поэтому будьте осторожны при адаптации к другим ситуациям. find - очень мощный и полезный инструмент, поэтому обязательно ознакомьтесь с его документацией!

1 голос
/ 01 апреля 2020

Эта команда поиска удаляет вложенные. git также:

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

-path ./.git -prune -o исключает только верхний уровень. git

Один недостаток - вы можете видеть сообщения, потому что find пытается получить доступ к уже удаленным каталогам.

Удалить echo, как только вы будете счастливы.

...