Как я могу рекурсивно удалить все каталоги, имя которых начинается с 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
означает без рекурсии; -тип 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