¿Es posible excluir directorios vacíos al crear un tar?

¿Es posible excluir directorios vacíos al crear un tar?

Tengo un comando de respaldo que se ve así:

tar cvpzf /backup/incremental-$now.tar.gz --after-date='1 day ago' -C / etc/ home/ root/  --exclude-from=/root/exclusion_list.txt --warning=no-file-unchanged > /backup/log-$now.txt 2>&1

El problema es que también incluye carpetas vacías, cuando todos los archivos que contienen no han cambiado, por lo que no se incluyen en la copia de seguridad incremental. Estoy buscando una manera de evitar esto, pero las únicas soluciones que he encontrado (canalizar los resultados de find a tar como argumentos con xargs) simplemente funcionan cuando tienes una carpeta, yo tengo tres.

Respuesta1

Por defecto, tar no proporciona un medio para omitir directorios vacíos. Dicho esto, no es demasiado trabajo sacar un simple script de la nada para hacer lo que hay que hacer.

Aquíes una discusión en un foro donde encontré la solución exactamente al mismo problema, cuando surgió la necesidad.

ACTUALIZACIÓN IMPORTANTE: Primero, necesito disculparme seriamente por mi negligente copia y pegado. Era un post nocturno y no estaba en la cima de mi intelecto...

La publicación correcta en el foro esaquí. En realidad es la misma persona que hace la misma pregunta en un foro diferente y obtiene una respuesta totalmente diferente. Los había marcado como favorito cuando encontré el problema y di el enlace al incorrecto.

En realidad, lo que muestra aquí es la forma de "canalizar" la salida del comando de búsqueda a tar. Tienes que ignorar todas las cosas sobre "más nuevo que" por las que pregunta el chico.

En cambio, la parte de búsqueda que necesita es así:

find . -type d ! -empty | ...

Por supuesto, debe reemplazar el punto ("".") con la ruta donde necesita buscar/tar para comenzar. Después de la tubería, continúe con el comando tar según el segundo enlace (el correcto).

Una vez más, lamento profundamente haber causado algún problema con mi falta de atención a los detalles.

Respuesta2

Otra forma que solo funciona si solo ha cambiado un pequeño conjunto de archivos es:

tar cvzf [...] `find . -mtime -1 -type f`

Si tiene un gran conjunto de cambios, puede volcar la lista de archivos modificados en un archivo y usar el parámetro --files-from en su comando tar:

find . -mtime -1 -type f > /tmp/changed.txt
tar cvzf [...] --files-from=/tmp/changed.txt

o en una línea

find . -mtime -1 -type f | tar cvzf [...] --files-from=/dev/stdin

información relacionada