GNU/Linux >> Linux Esercitazione >  >> Linux

Come combinare il comando 'tar' con 'find'

Puoi usare qualcosa come:

find var/log -iname 'anaconda.*' -print0 | tar -cvf somefile.tar --null -T -

Il -print0 e -T lavorare insieme per consentire nomi di file con spazi newline, ecc. Il - finale dice a tar di leggere i nomi dei file di input da stdin.

Nota che -print0 deve arrivare alla fine della tua dichiarazione, secondo questa risposta. Altrimenti probabilmente otterrai più file di quanto ti aspetti.


Nota: Vedi la risposta di @Iain per una soluzione un po' più efficiente.

Nota che find chiamerà il -exec azione per ogni singolo file trova.

Se esegui tar -cvf file.tar {} per ogni singolo file find output, ciò significa che sovrascriverai file.tar ogni volta, il che spiega perché ti ritrovi con un archivio rimasto che contiene solo anaconda.storage.log — è l'ultimo file find uscite.

Ora, in realtà vuoi aggiungere i file nell'archivio invece di crearlo ogni volta (questo è ciò che -c l'opzione lo fa). Quindi, usa quanto segue:

find var/log/ -iname "anaconda.*" -exec tar -rvf file.tar {} \;

Il -r l'opzione aggiunge all'archivio invece di ricrearlo ogni volta.

Nota: Sostituisci -iname anaconda.* con -iname "anaconda.*" . L'asterisco è un carattere jolly e può essere espanso dalla tua shell prima di find addirittura lo vede. Per evitare questa espansione, racchiudere l'argomento tra virgolette.

Per quanto riguarda tar rimuovendo il / iniziale :l'archivio deve contenere solo relative nomi di file. Se hai aggiunto file con un / iniziale , verrebbero archiviati come assoluti nomi di file, che letteralmente significano /var/… sul tuo computer, per esempio.

IIRC questa è semplicemente una precauzione per tar implementazioni diverse da GNU, ed è più sicuro in questo modo perché non sovrascriverai i tuoi dati effettivi in ​​/var/… quando estrai l'archivio se contiene nomi di file relativi.


Prova questo:

tar -cvf file.tar `find var/log/ -iname "anaconda.*"`

Stavi cercando di usare find a -exec tar . Ma il modo in cui -exec funziona, esegue quel comando una volta per ogni file corrispondente che trova, causando tar per sovrascrivere il file tar che produce ogni volta. Ecco perché sei finito solo con l'ultimo. Inoltre, devi mettere le virgolette intorno allo schema che specifichi in find in modo che la shell non lo espanda prima di passarlo a find .

Usando la sostituzione dei comandi con apici inversi (o usando $(...) notazione se preferisci), l'intero elenco di nomi prodotti da find viene incollato nuovamente sulla riga di comando come argomento di tar , facendo in modo che li scriva tutti in una volta.


Linux
  1. Trova file e directory su Linux con il comando find

  2. Come utilizzare il comando Tar in Linux

  3. Come estrarre il file tar.gz in Linux utilizzando la riga di comando

  4. Come controllare i permessi con il comando trova

  5. Apertura di un file .tar.gz con un singolo comando

Come utilizzare il comando head di Linux

Come usare il comando diff di Linux

Come creare backup con il comando tar in Linux

Come utilizzare il comando Linux rm con esempi

Come trovare file con il comando fd in Linux

Come trovare file con dozzine di criteri con il comando Trova Bash