Reemplace su find
Comando con esto e inténtalo de nuevo,
find /var/log -type f -mtime +7
Esto funcionará:
#!/bin/bash
files=()
while IFS= read -r -d $'\0'; do
files+=("$REPLY")
done < <(find /var/log/ -mtime +7 -print0)
tar cvfz backup.tar.gz "${files[@]}"
Tenga en cuenta el uso de "${files[@]}"
a diferencia de ${files[*]}
. "${files[@]}"
se expandirá para proporcionar tar
con un argumento por nombre de archivo y funcionará incluso si los nombres de archivo contienen espacios, tabulaciones o saltos de línea. Por el contrario, después de que el shell se expanda ${files[*]}
, dividirá las palabras, lo que podría alterar los nombres de los archivos.
Para obtener una explicación detallada del bucle utilizado para crear el files
matriz, consulte:¿Cómo puedo almacenar el resultado del comando de búsqueda como matrices en Bash?
Todos los archivos y directorios producidos por el comando find /var/log/ -mtime +7
se incluirá en el tar
expediente. Para incluir solo archivos, no directorios, consulte la respuesta de Skynet.
Para archivar registros de los siete días más recientes
Solo un personaje necesita cambiar:
#!/bin/bash
files=()
while IFS= read -r -d $'\0'; do
files+=("$REPLY")
done < <(find /var/log/ -mtime -7 -print0)
tar cvfz backup.tar.gz "${files[@]}"
Esto funciona porque find
interpreta los argumentos numéricos de la siguiente manera:
Los argumentos numéricos se pueden especificar como
+n para mayor que n,
-n para menos de n,
n para exactamente n.
Por lo tanto, -mtime +7
significa más de 7 días de antigüedad mientras que -mtime -7
significa menos de 7. Tenga en cuenta que find
ignorará las partes fraccionarias. Así +7
incluirá 8 días pero no 7,5 días. Ver man find
para más detalles.