Я хотел бы удалить все подкаталоги и файлы в указанном каталоге, за исключением каталогов, соответствующих определенному шаблону:
example_dir/model-*/gen-*/share/**
Общая настройка: Я сгенерировал несколько моделей (> 100), каждая из которых имеет >=1 поколение(я). Внутри этих моделей (например, example_dir/model-0/gen-0/
) есть несколько каталогов и подкаталогов.
Желаемый результат: Я хотел бы удалить все каталоги и файлы, кроме тех, которые соответствуют:
example_dir/model-*/gen-*/share/
В каждой отдельной модели/поколении это будет выглядеть примерно так:
rm -rf !(share)
решение1
Я не уверен, что полностью понимаю ваш вопрос, и я не уверен, какие последующие вопросы имеют смысл. Одна вещь, которая меня интересует, это если у вас есть дерево каталогов, например
example_dir
|-- model-0
| |-- gen-0
| | |-- share
| | |-- trash
| | | |-- more_trash
| | |-- file123.txt
| |-- grandfather
|-- platypus
foo
достаточно ли удалить example_dir/model-0/gen-0/trash
(и его содержимое), или вы также хотите удалить
example_dir/model-0/grandfather
, example_dir/platypus
и foo
? А как насчет example_dir/model-0/gen-0/file123.txt
?
Если вы хотите удалить trash
(и его содержимое) и file123.txt
, попробуйте
#!/bin/bash
shopt -s extglob
echo rm -rf example_dir/model-*/gen-*/!(share)
Если вы хотите удалить trash
(и его содержимое), но сохранить file123.txt
, попробуйте
#!/bin/bash
shopt -s extglob
echo rm -rf example_dir/model-*/gen-*/!(share)/
(добавляя /
после !(share)
).
В любом случае внимательно просмотрите вывод и, если вы уверены, что это то, что вам нужно, выполните команду еще раз без echo
.
Если вы также хотите удалить каталоги верхнего уровня, отличные от example_dir
, каталоги первого уровня, которые не соответствуют шаблону model-*
, или каталоги второго уровня, которые не соответствуют шаблону gen-*
, отредактируйте свой вопрос, чтобы уточнить его.