Команда не работает, потому что 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 будет игнорировать ошибки команд, которые он выполняет, что может привести к потере данных.