GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So kombinieren Sie den Befehl „tar“ mit „find“

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.


Linux
  1. Finden Sie Dateien und Verzeichnisse unter Linux mit dem Befehl find

  2. So verwenden Sie den Tar-Befehl unter Linux

  3. So prüfen Sie Berechtigungen mit dem Befehl find

  4. Wie finde ich den Prozess mit maximalen Dateideskriptoren?

  5. tr Befehl - wie man die Zeichenfolge \n durch einen tatsächlichen Zeilenumbruch (\n) ersetzt

So verwenden Sie den Linux-Kopfbefehl

So verwenden Sie den Linux-diff-Befehl

So erstellen Sie eine Sicherung mit dem tar-Befehl unter Linux

So verwenden Sie den Linux-rm-Befehl mit Beispielen

So finden Sie Dateien mit dem fd-Befehl in Linux

So finden Sie Dateien mit Dutzenden von Kriterien mit dem Bash-Suchbefehl