Sie können etwas verwenden wie:
find var/log -iname 'anaconda.*' -print0 | tar -cvf somefile.tar --null -T -
Der -print0
und -T
arbeiten zusammen, um Dateinamen mit Leerzeichen, Zeilenumbrüchen usw. zuzulassen. Der letzte -
weist tar an, die Eingabedateinamen von stdin zu lesen.
Beachten Sie, dass -print0
muss am Ende Ihrer Erklärung laut dieser Antwort stehen. Andernfalls erhalten Sie wahrscheinlich mehr Dateien als erwartet.
Hinweis: Siehe die Antwort von @Iain für eine etwas effizientere Lösung.
Beachten Sie, dass find
ruft -exec
an Aktion für jede einzelne Datei es findet.
Wenn Sie tar -cvf file.tar {}
ausführen für jede einzelne Datei find
Ausgaben, bedeutet dies, dass Sie file.tar
überschreiben jedes Mal, was erklärt, warum am Ende ein einziges Archiv übrig bleibt, das nur anaconda.storage.log
enthält — es ist die letzte Datei find
Ausgänge.
Jetzt möchten Sie tatsächlich anhängen die Dateien ins Archiv, anstatt sie jedes Mal neu zu erstellen (dafür ist der -c
Option tut). Verwenden Sie also Folgendes:
find var/log/ -iname "anaconda.*" -exec tar -rvf file.tar {} \;
Die -r
Option an das Archiv angehängt, anstatt es jedes Mal neu zu erstellen.
Hinweis: Ersetzen Sie -iname anaconda.*
mit -iname "anaconda.*"
. Das Sternchen ist ein Platzhalter und kann von Ihrer Shell vor find
erweitert werden sieht es sogar. Um diese Erweiterung zu verhindern, schließen Sie das Argument in doppelte Anführungszeichen ein.
Wie bei tar
führendes /
entfernen :Das Archiv sollte nur relative enthalten Dateinamen. Wenn Sie Dateien mit einem vorangestellten /
hinzugefügt haben , würden sie als absolut gespeichert Dateinamen, was wörtlich /var/…
bedeutet z.B. auf Ihrem Computer.
IIRC dies ist einfach eine Vorsichtsmaßnahme für tar
andere Implementierungen als GNU, und es ist auf diese Weise sicherer, weil Sie Ihre tatsächlichen Daten in /var/…
nicht überschreiben wenn Sie das Archiv entpacken, wenn es relative Dateinamen enthält.
Versuchen Sie Folgendes:
tar -cvf file.tar `find var/log/ -iname "anaconda.*"`
Sie haben versucht, find
zu verwenden bis -exec tar
. Aber so wie die -exec
Option funktioniert, wird dieser Befehl einmal für jede gefundene übereinstimmende Datei ausgeführt, was zu tar
führt um die tar-Datei zu überschreiben, die es jedes Mal erzeugt. Deshalb bist du nur bei der letzten gelandet. Außerdem müssen Sie das Muster, das Sie für find
angeben, in Anführungszeichen setzen damit die Shell es nicht erweitert, bevor es an find
übergeben wird .
Befehlsersetzung mit Backticks verwenden (oder $(...)
verwenden Notation, wenn Sie es vorziehen), die gesamte Liste der Namen, die von find
erstellt wurde wird als Argument für tar
wieder in die Befehlszeile eingefügt , was dazu führt, dass sie alle auf einmal geschrieben werden.