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