Удалить рекурсивно, но исключить дерево определенных каталогов - PullRequest
0 голосов
/ 13 апреля 2020

Допустим, у меня есть каталог с именем "sample", и он содержит следующее содержимое

sample
├── files
│   └── usr
│       ├── 1.txt
│       ├── 2.txt
│       └── bin
│           └── 12.txt
├── opt
│   └── lib
│       ├── 33.txt
│       └── log
│           └── access.log
├── sub_dir1
│   └── sub_dir1.1
│       └── sub_dir1.1.1
└── sub_dir2
    └── sub_dir2.2
        └── sub_dir2.2.2

Как удалить все, кроме sample/opt/lib/log/access.log

Я надеялся, что что-то подобное работа

find sample/ -type d -print  | grep -v "sample/opt/lib/log/access.log" | xargs rm -rf

но это не

Ответы [ 3 ]

2 голосов
/ 13 апреля 2020

Эта команда gnu find должна работать для вас:

find sample/ ! -path 'sample/opt/lib/log/access.log' -delete 2>/dev/null
1 голос
/ 13 апреля 2020

Причина, по которой grep -v не соответствует должным образом, заключается в том, что find sample/ будет возвращать все совпадения как sample//some/path, что нормально для bash.

Таким образом, чтобы ваш код работал по желанию в однострочном скрипте вы можете выполнить любое из следующих действий:

  • find sample -type d -print | grep -v "sample/opt/lib/log/access.log" | xargs rm -rf
  • find sample/ -type d -print | grep -v "sample//opt/lib/log/access.log" | xargs rm -rf

Но слово для мудрых ... возможно, что опечатка может найти вас удалить больше, чем вы хотели. Рекомендуется всегда иметь положительный результат проверки до xargs rm, например | grep sample | xargs rm -rf

1 голос
/ 13 апреля 2020

Использование Python: вы можете удалить все файлы, кроме «access.log», а затем удалить папки:

for root, folders, files in os.walk(sample_dir):
    for name in files:
        if name != "access.log":
            os.remove(os.path.join(root, name))

for root, folders, files in os.walk(sample_dir, topdown=False):
    try:
        os.rmdir(root)
    except IOError:
        pass

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...