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.