LINUX.ORG.RU
ФорумAdmin

массовое выборочное удаление файлов

 , , ,


1

1

Здравствуйте! Требуется удалить старые письма в каталоге постфикса, но не все, а от определённого адресата (сервисный). Написал скрипт с поиском нужного текста и поиск по дате:

find `grep -lir '<eml@server.ru>' $findcat` -mtime +30 -exec cp -p '{}' $targetcat \;

После отработки grep, find выдаёт сообщение, что слишком много строк, и он искать не может. На тестовых каталогах с небольшим количеством файлов отрабатывает, а на боевом не хочет. Как обойти такое ограничение?


Может лучше переписать спипт?
Например можно использовать xargs. Первое что пришло в голову: grep выдаёт список файлов содержащих нужную строку, xargs запускает для каждого find который проверяет его тухлость, если файл старый, удаляет. Но это точно не лучший вариант

MrClon ★★★★★
()
find . -mtime +30 -exec grep -lir '<eml@server.ru>' . \;

получаешь список файлов, и через xargs делаешь с ними что хочешь

annulen ★★★★★
()
Ответ на: комментарий от annulen

Если я ничего не путаю то эта команда вызовет рукурсивный grep в текущей рабочей директории столько раз сколько find найдёт в ней файлов старше 30 дней.
Скорее надо как-то так:

find . -mtime +30 -exec grep -li '<eml@server.ru>' '{}' \;

MrClon ★★★★★
()
Ответ на: комментарий от MrClon

Вот так ищет правильно:

cd /каталог/поиска/
find . -mtime +30 -exec grep -l <eml@server.ru>' '{}' \;

Но теперь не понятно, как выполнить удаление или копирование файлов. Так как каталог поиска - дерево каталогов, find то ищет рекурсивно, но на выходе - только имена файлов, без абсолютных путей. Вот такое:

cd /каталог/поиска/
find . -mtime +1 -exec grep -l '<eml@server.ru>' '{}' 2>1 -exec cp '{}' /каталог/назначения/ \;
Не работает. Да и grep жалуется, что часть найденного финдом - каталоги. Задача оказалась сложнее, чем казалась сначала. И вообще, у меня такое ощущение, что я велосипед изобретаю. До меня никто таких задач не решал?

danver
() автор топика
Ответ на: комментарий от danver

только имена файлов, без абсолютных путей

На выходе должны быть пути к файлам относительно директории в которой искал find. т.е. зная эту директорию (в твоём примере это /каталог/поиска/) можно восстановить абсолютный путь, или просто удалить по относительному.
Что-бы сразу получить абсолютный путь: find . замени на find /каталог/поиска/.
Что-бы искать только файлы добавь в условия find-а -type f.
Ну и про xargs тубе уже и пример показали. find выдаёт список файлов, xargs запускает для каждого из них rm (или любую другую заданную команду). man xargs короче

MrClon ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.