GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo combinar el comando 'tar' con 'buscar'

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.


Linux
  1. Encuentra archivos y directorios en Linux con el comando de búsqueda

  2. Cómo usar el comando Tar en Linux

  3. Cómo extraer el archivo tar.gz en Linux usando la línea de comandos

  4. ¿Cómo encontrar el proceso con el máximo de descriptores de archivo?

  5. ¿Cómo agregar la salida a un archivo?

Cómo usar el comando de cabeza de Linux

Cómo usar el comando diff de Linux

Cómo crear una copia de seguridad con el comando tar en Linux

Cómo usar el comando rm de Linux con ejemplos

Cómo encontrar archivos con el comando fd en Linux

Cómo encontrar archivos con docenas de criterios con el comando Bash Find