-1

У меня в дереве исходников много файлов с разными типами файлов. В исходном дереве много подпапок. Как сохранить структуру папок исходного дерева и удалить все файлы, кроме файлов .h?

2 ответа2

2

Вы можете использовать find с отрицательными предикатами для этого. По сути, создайте команду, которая находит все файлы, которые вы хотите сохранить, отмените соответствующие условия (так, чтобы они теперь соответствовали файлам, которые вы не хотите сохранять), и скажите, чтобы они удалили эти файлы или просто убрать их с дороги.

Например, эта команда напечатает список всех файлов в текущем каталоге, включая подкаталоги, имена которых заканчиваются на .h:

find . -type f -name '*.h' -print

(-type f ограничивает совпадение только для обычных файлов; не для каталогов, узлов устройств и т.д. Цитата вокруг *.h важна.)

Теперь, инвертировать состояние имя , чтобы напечатать все файлы , которые не имеют имена , которые заканчиваются на .h

find . -type f -not -name '*.h' -print

(Обратите внимание, что -not не соответствует POSIX, но здесь он чище, поскольку не требует экранирования оболочки. Вы также можете использовать стандарт POSIX ! вместо этого, но по крайней мере Баш требует этого ! сбежал.)

Как только вы убедитесь, что список файлов соответствует тому, что вы хотите удалить, просто замените -print на -delete чтобы фактически удалить файлы. Или, если вам нужно решение POSIX (снова), вы можете использовать -exec rm '{}' '+' вместо -delete , за счет вызова rm неизвестное количество раз.

1

Вы можете сделать это с помощью одной простой команды:

find . -not -name *.h -exec rm -r "{}" \;

Если вы хотите убедиться, что он удалит то, что вы действительно хотите, вы можете удалить часть -exec и просто добавить флаг -print чтобы увидеть, что соответствует. Если вы уверены, вы можете добавить -exec rm -r "{}" \; часть.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .