El comando no funciona porque find
invoca una nueva tar
instancia para cada archivo que encuentra, y cada tar
instancia sobrescribe el archivo de archivo con uno nuevo que contiene solo el archivo que le proporcionó find
. Lo que desea es find
armar una lista completa de todos los archivos, luego pasar esa lista a una sola tar
:
find /u01/oracle/files -mtime +30 -print0 | tar -czvf filename_$(date +%Y-%m-%d).tar.gz --null -T /dev/stdin
Si su versión de lo tar
admite, agregue el --remove-files
indicador para eliminar los archivos de origen que se comprimieron correctamente.
Si tar
no admite este indicador, puede utilizar este script en su lugar:
#!/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"
El uso de un archivo temporal para almacenar la lista en lugar de regenerarlo evita una condición en la que un archivo podría no considerarse lo suficientemente antiguo para el tar
comando, pero para cuando se creó el archivo, el tiempo ha pasado y coinciden más archivos.
Asegúrese de incluir el -e
en el shebang (primera línea). Si lo omite, bash ignorará los errores de los comandos que ejecuta, lo que podría conducir a la pérdida de datos.