Удаление всех подкаталогов кроме тех, которые соответствуют определенному шаблону

Я хотел бы удалить все подкаталоги и файлы в данном каталоге, кроме каталогов, которые соответствуют определенному шаблону:

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-* шаблон, пожалуйста, отредактируйте свой вопрос, чтобы уточнить.

Другие вопросы по тегам