Назад | Перейти на главную страницу

Glob соответствует каталогам рекурсивного удаления, кроме определенного каталога

Как я могу рекурсивно удалить все каталоги, имя которых начинается с app-deployment-* кроме определенного каталога с именем app-deployment-245a578. I.E. удалите все каталоги, используя глобальное совпадение, но не удаляйте конкретный каталог с известным именем.

rm -rf app-deployment-* # except app-deployment-245a578
find ./ -maxdepth 1 \
        -type d \
        -name 'app-deployment-*' \
        ! -name 'app-deployment-245a578' \
        -exec echo rm -rf {} +

Пояснения:

  • -maxdepth 1 означает без рекурсии;
  • -type d означают поиск только по каталогам;
  • -name 'app-deployment-*' это шаблон каталогов, которые вы ищете;
  • ! -name 'app-deployment-245a578' это шаблон каталогов, которые вы исключаете из списка результатов
    Повторите это несколько раз, если вы хотите исключить несколько каталогов;
  • exec echo rm -rf - выполнить команду echo rm -rf;
  • {} + - добавить результаты поиска в качестве параметров к команде выше.
    Имена каталогов будут добавляться так: echo rm -rf dir1 dir2 dir3.

О последнем пункте. Если вы хотите вызывать команду с каждым параметром отдельно (я имею в виду echo rm -rf dir1; echo rm -rf dir2;) вы должны написать {} \; (обратите внимание на обратную косую черту) вместо {} +.

О команде. я пишу echo rm -rf вместо того rm -rf из-за всей опасности использования rm -rf с любым типом сопоставления с образцом. Будьте внимательны и проверьте все перед снятием echo из команды.

Дальнейшее чтение об опасности паттернов rm +: Творческое использование rm

UPD: стоит отметить, что {} + должен быть в конце команды, т.е. вы не можете использовать -exec rm {} + -rf