Предположите, что у меня есть структура каталогов следующим образом:
application
│
├── config
│ ├── c1.conf
│ └── c2.conf
│
├── logs
│ ├── l1.txt
│ └── l2.txt
│
└── src
├── static
├── s1.py
└── s2.py
Теперь я хочу удалить все папки кроме config
и logs
(в этом случае, только src
). мой PWD
в настоящее время родитель appliaction/
dir (т.е. Я вижу application
в моем PWD
).
Какую команду я должен использовать? (Я попробовал rm -rf
с некоторыми опциями, но по ошибке удаленными другими файлами, таким образом, я хотел бы знать корректный ответ прежде, чем попробовать что-либо еще!)
Попробуйте find ./application/ -type d -not -name config -not -name logs
.
, Если это возвращает надлежащие каталоги, запущенные
find ./application/ -type d -not -name config -not -name logs -exec rm -R {} \;
exec rm -R {} \;
в конце, удаляет каталог, даже если это не пусто.
То, что я сделаю со своей оболочкой (zsh), следующее (но я думаю, что с ударом существует что-то эквивалентное).
Тип
echo application/*(/)
и, , не поражая возврат , ВКЛАДКА нажатия .
оболочка развернет шарик шаблона; в этом случае, список всех каталогов под application
; строка должна быть теперь
echo application/config application/logs application/src
Теперь, я отредактировал бы строку для удаления каталогов, которые я хочу поддержать.
я утраиваю проверку и редактирую начальную букву echo
к rm -rf
.
я проверяю снова и...
... возврат хита.
Так или иначе, такая задача (выбирающий ручными файлами или папками для применения действие к ним) действительно лучше сделана с некоторой визуальной помощью, если Вы не командная строка "компьютерный фанат" как я..., например, люди действительно любят Полуночный Командующий .
Таким образом, является немного больше работы, чем некоторые другие возможные решения, но когда я удаляю файлы, мне нравится мочь проверить дважды то, что уходит навсегда. Шаги ниже предполагают, что Вы видите "приложение" в своем PWD, как указано в Вашем вопросе.
Сначала создайте новый текстовый файл, содержащий названия каждой папки, которую Вы хотите сохранить (не, удаляют), с одной папкой на строку. Сохраните его как to-keep.txt
например:
config
logs
Затем скопируйте следующее в текстовый редактор и сохраните его как rm-exclude.sh
так, чтобы все три файла были в том же каталоге.
#!/usr/bin/env bash
find "./$1" -maxdepth 1 -type d ! -path "./$1" > to-delete.txt
dels=`cat to-delete.txt`
readarray -t keeps < to-keep.txt
for keep in "${keeps[@]}"; do
dels=`echo "$dels" | grep -v "$keep"`
done
echo "$dels" > to-delete.txt
Сделайте это исполняемым использованием:
chmod +x rm-exclude.sh
Затем выполните его со следующим, где PATH
путь к папке "приложения" от Вашего PWD. В Вашем примере, PATH
просто был бы application
.
./rm-exclude.sh PATH
Наконец, проверить to-delete.txt
для проверки ничто не становится удаленным, который не должен быть и работать:
readarray -t dels < to-delete.txt; for del in "${dels[@]}"; do rm -rf "$del"; done
Если Вы не заботитесь о проверке содержания txt файла, можно просто скопировать и вставить вышеупомянутую команду в конец rm-exclude.sh
так, чтобы запущение скрипта сделало все, пока Вы имеете to-keep.txt
уже заполненный. Конечный результат должен состоять в том что каждая прямая подпапка application
не в to-keep.txt
будет удален, наряду с их содержанием.
На основе ответа Jos я использую это для удаления всех файлов и каталогов в текущем каталоге только, за исключением .git
каталог.
sudo find /home/jeffy/django_files/djauth_lifecycle_tutorial/part_04/ -maxdepth 1 -mindepth 1 -not -name .git -exec rm -rf {} \;
Я на самом деле был испуган и думал, что это удалило .git
каталог также, но я просто забыл использовать a
флаг с la
(ls -la
).
mindepth
флаг должен постараться не удалять сам корневой каталог. -maxdepth
препятствует тому, чтобы все подкаталоги и файлы были возвращены, которые избыточны с f
флаг.
(Кроме того, никогда не используйте относительные пути при использовании rm -r
!)