У меня в дереве исходников много файлов с разными типами файлов. В исходном дереве много подпапок. Как сохранить структуру папок исходного дерева и удалить все файлы, кроме файлов .h?
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
неизвестное количество раз.
Вы можете сделать это с помощью одной простой команды:
find . -not -name *.h -exec rm -r "{}" \;
Если вы хотите убедиться, что он удалит то, что вы действительно хотите, вы можете удалить часть -exec
и просто добавить флаг -print
чтобы увидеть, что соответствует. Если вы уверены, вы можете добавить -exec rm -r "{}" \;
часть.