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