Cómo encontrar y tar archivos luego eliminarlos

0

Necesito encontrar archivos que tengan más de 30 días, alquitránarlos y comprimirlos y eliminar los que ya haya alquitranado y comprimido.

Estaba tratando de ejecutar algo como esto pero no parece que funcione

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

Respuestas:

0

El comando no funciona porque findinvoca una nueva tarinstancia para cada archivo que encuentra, y cada tarinstancia sobrescribe el archivo de archivo con uno nuevo que contiene solo el archivo que le proporcionó find. Lo que desea es findarmar 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 taradmite, agregue el --remove-filesindicador para eliminar los archivos de origen que se comprimieron correctamente.

Si tarno 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 tarcomando, pero para cuando se creó el archivo, el tiempo ha pasado y coinciden más archivos.

Asegúrese de incluir el -een 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.

Wüstengecko
fuente
Recibo este error cuando intento ejecutar el último
R_Mat
oracle $ find / u01 / oracle / files -mtime +60 -print0> /tmp/filelist.txt tar -czvf filename _ $ (fecha +% Y-% m-% d) .tar.gz --null -T / tmp /filelist.txt xargs -0 rm </tmp/filelist.txt rm /tmp/filelist.txt find: las rutas deben preceder a la expresión: tar Uso: find [-H] [-L] [-P] [-Olevel] [ -D ayuda | árbol | búsqueda | estadísticas | tasas | opt | exec] [ruta ...] [expresión]
R_Mat
@R_Mat He mejorado y aclarado la respuesta sobre esa parte, consulte el código editado.
Wüstengecko
#! / bin / bash -e filelist = "$ (mktemp)" find /u01/oracle/files/*.aud -mtime +30 -print0> "$ filelist" tar -czvf "filename _ $ (fecha +% Y- % m-% d) .tar.gz "--null -T" $ filelist "xargs -0 rm <" $ filelist "rm" $ filelist "
R_Mat
Cuando lo ejecuto así
aparece