Как запустить 2 команды после поиска файлов командой find

Рейтинг: 1Ответов: 1Опубликовано: 19.02.2023

Появилась необходимость архивировать файлы старше 7 дней. Делаю это при помощи bzip2. Но в нем нет встроенного удаления файла, после архивации.

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

Ответы

▲ 2

Немного покопавшись нашёл, как использовать 2 команды с find. В этом помогает параметр -exec:

find /home/user/logs -type f -name '*log' -mtime +7 -exec bash -c "bzip2 -k {}; rm {}" \;

Пояснения:

  • /home/user/logs - каталог, в котором мы ищем файлы
  • -type f - искать только файлы
  • -mtime +7 - файлы, которые старше 7 дней
  • -exec bash -c - оболочка под которой будут запускаться следующие команды
  • "bzip2 -k {}; rm {}" - список команда, запускаемых поочерёдно (будут применяться к каждому файлу по отдельности

К примеру, в директории /home/user/logs хранятся следующие файлы:

result_program_1.log
result_program_2.log
result_program_3.log
result_program_4.log
result_program_5.log

Первые три файла, старше 7 дней, так что выполнение вышеописанной команды find в результате будет выглядеть так:

bzip2 -k result_program_1.log
rm result_program_1.log

bzip2 -k result_program_2.log
rm result_program_2.log

bzip2 -k result_program_3.log
rm result_program_3.log