Puedes usar algo como:
find var/log -iname 'anaconda.*' -print0 | tar -cvf somefile.tar --null -T -
El -print0
y -T
trabajen juntos para permitir nombres de archivo con espacios, saltos de línea, etc. El -
final le dice a tar que lea los nombres de archivo de entrada desde stdin.
Tenga en cuenta que -print0
debe venir al final de su declaración, según esta respuesta. De lo contrario, probablemente obtendrá más archivos de los que espera.
Nota: Consulte la respuesta de @Iain para obtener una solución algo más eficiente.
Tenga en cuenta que find
llamará al -exec
acción para cada archivo encuentra.
Si ejecuta tar -cvf file.tar {}
por cada archivo find
salidas, esto significa que sobrescribirá file.tar
cada vez, lo que explica por qué te queda un archivo que solo contiene anaconda.storage.log
— es el último archivo find
salidas.
Ahora, en realidad desea agregar los archivos al archivo en lugar de crearlos cada vez (esto es lo que -c
la opción lo hace). Entonces, usa lo siguiente:
find var/log/ -iname "anaconda.*" -exec tar -rvf file.tar {} \;
El -r
la opción se agrega al archivo en lugar de volver a crearlo cada vez.
Nota: Reemplazar -iname anaconda.*
con -iname "anaconda.*"
. El asterisco es un comodín y su shell puede expandirlo antes de find
incluso lo ve. Para evitar esta expansión, envuelva el argumento entre comillas dobles.
En cuanto a tar
eliminando /
inicial :El archivo solo debe contener relativo nombres de archivos Si agregó archivos con un /
inicial , se almacenarían como absolutos nombres de archivos, que literalmente significan /var/…
en su computadora, por ejemplo.
IIRC esto es simplemente una precaución para tar
implementaciones que no sean GNU, y es más seguro de esta manera porque no sobrescribirá sus datos reales en /var/…
cuando extrae el archivo si contiene nombres de archivo relativos.
Prueba esto:
tar -cvf file.tar `find var/log/ -iname "anaconda.*"`
Estabas tratando de usar find
a -exec tar
. Pero la forma en que -exec
funciona, ejecuta ese comando una vez por cada archivo coincidente que encuentra, causando tar
para sobrescribir el archivo tar que produce cada vez. Es por eso que solo terminaste con el último. Además, debe poner comillas alrededor del patrón que especifique para find
para que el shell no lo expanda antes de pasarlo a find
.
Usando la sustitución de comandos con acentos graves (o usando $(...)
notación si lo prefiere), la lista completa de nombres producidos por find
se vuelve a pegar en la línea de comando como argumentos para tar
, haciendo que los escriba todos a la vez.