Мне нужно найти файлы старше 30 дней, распаковать их, сжать и удалить те, которые я уже распаковал и сжал.

Я пытался выполнить что-то вроде этого, но это не похоже на его работу

find /u01/oracle/files -mtime +30 -exec tar -czvf filename_$(date +%Y-%m-%d).tar.gz /u01/oracle/files {} \;

1 ответ1

0

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

find /u01/oracle/files -mtime +30 -print0 | tar -czvf filename_$(date +%Y-%m-%d).tar.gz --null -T /dev/stdin

Если ваша версия tar поддерживает это, добавьте флаг --remove-files чтобы удалить исходные файлы, которые были успешно сжаты.

Если ваш tar не поддерживает этот флаг, вы можете использовать этот скрипт:

#!/bin/bash -e
filelist="$(mktemp)"
find /u01/oracle/files -mtime +30 -print0 > "$filelist"
tar -czvf "filename_$(date +%Y-%m-%d).tar.gz" --null -T "$filelist"
xargs -0 rm < "$filelist"
rm "$filelist"

Использование временного файла для хранения списка вместо его регенерации предотвращает условие, при котором файл может считаться недостаточно старым для команды tar , но к моменту создания архива прошло время, и другие файлы совпадают.

Обязательно -e в шебанг (первая строка). Если вы его опустите, bash будет игнорировать ошибки команд, которые он выполняет, что может привести к потере данных.

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