Поиск и удаление архивных файлов в Linux
Дано: архивные файлы в директории, ОС Linux
Найти: все файлы которые внутри содержат определенное значение и удалить их
Нахожу файлы вот такой командой:
find /путь -type -f -name "*" -ctime +0 -exec zgrep -i 'текст123' {} \;
Вопрос, как корректно суда добавить удаление таких файлов? (вначале ищем нужные потом удаляем) Или может быть вообще по другому все переписать.
Ответы (2 шт):
Можно сделать проверку условия в ключе exec:
find /путь -type -f -ctime +0 -exec sh -c "if test zgrep -iq 'текст123' {}; then rm -f {}; fi" \;
В данном случае sh -c "if test zgrep -iq 'текст123' {}; then rm -f {}; fi" \; - вызов оператора сравнения if в отдельной оболочке shell
Не забудьте предварительно протестировать
Вопрос, как корректно суда добавить удаление таких файлов? (вначале ищем нужные потом удаляем)
find — простая утилита... нужно удалить найденные файлы — можно просто добавить -delete:
find /путь -type -f -name "*" -ctime +0 -exec zgrep -i 'текст123' {} \; -delete
Как это работает
-exec ... {} \; является не только действием, но и тестом, таким же как -name или -ctime: он считается успешным, если вызываемая программа вернула код корректного завершения, т.е. ноль; а zgrep (как и grep) возвращает ноль, когда в переданном ему файле найдено хоть одно совпадение.
Чтобы вывод был менее грязным/более полезным можно передать ключик -q zgrep'у, дабы он перестал выводить найденные строки и -print, find'у, чтобы выводить имена удаляемых файлов.