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.