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

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

rm -rf app-deployment-* # except app-deployment-245a578
0
задан 30 September 2019 в 05:28
1 ответ
find ./ -maxdepth 1 \
        -type d \
        -name 'app-deployment-*' \
        ! -name 'app-deployment-245a578' \
        -exec echo rm -rf {} +

Пояснения:

  • -maxdepth 1 означает без рекурсии;
  • -тип 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

1
ответ дан 4 December 2019 в 15:37

Теги

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