Удалите файлы и каталоги, даже если они не пусты, кроме некоторых каталогов

Я пытаюсь удалить все содержимое каталога с некоторыми исключениями. В настоящее время я использую это:

find . -type f | grep -vZf ../../exclude.file | xargs rm -rf 

exclude.file содержит:

 *log* world* crash-reports banned-ips* 

Я не хочу удалять папки с world , log или сбоями или любым их содержимым (* для покрытия резервных копий, которые генерируются как world.zip ).

Вышеприведенная команда делает это, но не удаляет непустые каталоги. Например, каталог Config оставлен, но мне нужно его удалить.

Я также экспериментировал следующим образом:

 find -maxdepth 0 -not -name '*log*' -not -name 'crash-reports' -not -name 'world*' | xargs rm -rf 

Но я все равно получаю тот же результат.

Есть ли способ сделать это?

2 Solutions collect form web for “Удалите файлы и каталоги, даже если они не пусты, кроме некоторых каталогов”

-type f будет искать файлы, а не каталоги. -maxdepth 0 будет только найти каталог, который вы ищете ( . ). Вам нужно будет найти файлы, которые вы действительно хотите передать в rm .

Стандартный способ сделать это – исключить каталоги и все их содержимое, как это (непроверенный!):

 find . -mindepth 1 \( -name '*log*' -o -name 'crash-reports' -o -name 'world*' \) -prune -o -print 

То, что вы хотите, невозможно IMHO с одним запуском find если вы не знаете, что все каталоги, которые нужно пропустить, находятся на первом уровне каталога.

первый шаг

В первом запуске удалите все файлы (а точнее: не-каталоги):

 find . \( -type d \ \( -name '*log*' -o -name 'world*' -o -name 'crash-reports' -o -name 'banned-ips*' \) \ -prune \) -o \( -type d -o -print \) 

второй шаг

Создайте фиктивный файл в каждом (вспомогательном) каталоге, который нужно пропустить:

 find . -type d \( \ \( -name '*log*' -o -name 'world*' -o -name 'crash-reports' -o -name 'banned-ips*' \) \ -o \( -path '*/*log*/*' -o -path '*/world*/*' -o -path '*/crash-reports/*' -o -path '*/banned-ips*/*' \) \) \ -exec touch {}/dontdeletethisdirecory 

третий шаг

Теперь все пустые каталоги могут быть удалены. Простой подход – передать все каталоги в rmdir . Удаляются только пустые:

 find . -depth -type d -exec rmdir {} \; 

необязательный последний шаг

Теперь вы можете удалить фиктивные файлы:

 find . -type -f -name dontdeletethisdirecory -delete 
  • Создание каталога, защищенного от 'rm -rf'
  • Какова идея, по которой rm не удаляет файл без записи по умолчанию?
  • Рекурсивно удалять SVN-файлы
  • Двойная проверка rm в zsh
  • синхронизировать файлы с разным расширением в MacOS
  • удалите номер версии с низкой версией
  • Сжатие и удаление исходного каталога с ограниченным хранилищем
  • Rm без удаления самого файла / каталога
  • Обнаружение размера файла и операция условно
  • Почему «rm *» не работает, когда есть файлы, начинающиеся с дефиса?
  • Почему rm -r такое же, как rm -R?
  • Interesting Posts

    Установка прав доступа rwx по умолчанию для группы, но только rw разрешения по умолчанию для файлов

    Поддержка snmp / snmptrap ipv6

    проверьте, запущен ли java-процесс и повторно запущен, если он не запущен

    shell: сохранить завершающие символы новой строки ('\ n') в подстановке команд

    Настройка CUPS и беспроводного принтера Brother

    Как установить проприетарные драйверы nvidia на Fedora 23?

    Расширьте один псевдоним во втором псевдониме

    Как удалить предварительно сконфигурированные зоны в firewalld

    Удалить строку в файле A, если строка в файле B соответствует нескольким столбцам в файле A

    Как запустить gedit с терминала и отсоединить его (как работает команда «subl»)?

    Su как root и запустить команду в одной строке

    Баш не возвращается $? переменная правильно

    Как проверить, доступен ли смонтированный том?

    systemd: переместить getty в tty2 + и запустить скрипт на tty1

    kill -STOP отключается

    Linux и Unix - лучшая ОС в мире.