Как удалить все файлы/папки из папки кроме немногих папок?

Предположите, что у меня есть структура каталогов следующим образом:

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 с некоторыми опциями, но по ошибке удаленными другими файлами, таким образом, я хотел бы знать корректный ответ прежде, чем попробовать что-либо еще!)

3
задан 28 October 2015 в 20:06

4 ответа

Попробуйте 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 {} \; в конце, удаляет каталог, даже если это не пусто.

7
ответ дан 1 December 2019 в 13:13

То, что я сделаю со своей оболочкой (zsh), следующее (но я думаю, что с ударом существует что-то эквивалентное).

  1. Тип

    echo application/*(/) 
    

и, , не поражая возврат , ВКЛАДКА нажатия .

  1. оболочка развернет шарик шаблона; в этом случае, список всех каталогов под application; строка должна быть теперь

    echo application/config application/logs application/src
    
  2. Теперь, я отредактировал бы строку для удаления каталогов, которые я хочу поддержать.

  3. я утраиваю проверку и редактирую начальную букву echo к rm -rf.

  4. я проверяю снова и...

  5. ... возврат хита.

Так или иначе, такая задача (выбирающий ручными файлами или папками для применения действие к ним) действительно лучше сделана с некоторой визуальной помощью, если Вы не командная строка "компьютерный фанат" как я..., например, люди действительно любят Полуночный Командующий .

0
ответ дан 1 December 2019 в 13:13

Таким образом, является немного больше работы, чем некоторые другие возможные решения, но когда я удаляю файлы, мне нравится мочь проверить дважды то, что уходит навсегда. Шаги ниже предполагают, что Вы видите "приложение" в своем 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 будет удален, наряду с их содержанием.

1
ответ дан 1 December 2019 в 13:13

На основе ответа 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!)

1
ответ дан 1 December 2019 в 13:13

Другие вопросы по тегам:

Похожие вопросы: