Schlagwort-Archive: Tar

In einem Tar-Archiv die größten Dateien ermitteln

Wie in „Tar-Archive vergleichen“ beschrieben, werden Backups manchmal plötzlich größer. Wenn man nun einfach wissen möchte, welches denn die größten Dateien in dem Archiv sind, geht das ohne viel Aufwand mit

tar tvf 20141117.tgz | sed 's/ \{1,\}/\t/g' | cut -f 3,6 | sort -n | tail

Tar gibt die Größe in Bytes aus. Leider kenne ich keine Option, mit welcher sich bei tar die Anzeige der Größe beeinflussen lässt.

Tar-Archive vergleichen

Ich sichere bestimmte Verzeichnisse von Rechnern täglich in Tar-Archiven (siehe auch „Verzeichnisse auf einen anderen Rechner übertragen“). Nun kommt es vor, dass diese Archive plötzlich oder auch mit der Zeit größer werden. Dann will man natürlich wissen, wieso. Um im ersten Schritt zu vermeiden, dass ich die Archive auspacken und dann vergleichen muss, lese ich den Inhalt zwei Tar-Dateien aus, bereite sie mittels sed auf und vergleiche sie mit diff:

tar tvf 20140822.tgz | sed 's/^\([a-zA-Z\-]\{1,\}\) \([^[:blank:]]\{1,\}\) \{1,\}\([0-9]\{1,\}\) .* \(.*\)$/\4 \3/' > 20140822.content 
tar tvf 20140901.tgz | sed 's/^\([a-zA-Z\-]\{1,\}\) \([^[:blank:]]\{1,\}\) \{1,\}\([0-9]\{1,\}\) .* \(.*\)$/\4 \3/' > 20140901.content
diff -y -W 200 --suppress-common-lines 20140822.content 20140901.content > 20140822vs20140901

Sofern sich nicht all zu viele Dateien geändert haben oder dazu gekommen sind, kann das Ergebnis schon erste Hinweise geben. Ansonsten muss man mit den üblichen Werkzeugen (z.B. grep) weiter filtern und analysieren.

Verzeichnisse auf einen anderen Rechner übertragen

Im vorigen Artikel habe ich gezeigt, wie man mit TAR ein komplettes Verzeichnis so verschieben bzw. kopieren kann, dass alle Rechte erhalten bleiben. Hier kommt nun die erweiterte Fassung zum kopieren von Verzeichnissen auf einen anderen Rechner mittels SSH und TAR. Und als Bonbon gibt’s ein Script zum Erstellen von Backups von anderen Rechnern.

Um das Verzeichnis foo vom eigenen Rechner auf dem Rechner kermit als Unterverzeichnis von /bar zu speichern benutzt man den folgenden Befehl:

tar cpSf - foo | ssh kermit "cd /bar && tar xpSvf -"

Wie man sieht, ähnelt der Aufruf sehr dem Befehl zum kopieren auf dem lokalen Rechner, lediglich das „ssh kermit“ ist neu (und die Klammern brauchen wir hier nicht). Ich gehe hier davon aus, dass der User des lokalen Rechners auch auf dem Rechner kermit bekannt ist. Soll auf kermit ein anderer Account, z.B. klaus, verwendet werden, schreibt man einfach „ssh klaus@kermit“. Der User muss auf jeden Fall ausreichende Rechte im Zielverzeichnis haben. Da ein Ziel ist, die Rechte beizubehalten, sollte das root sein.

Man kann tar die Daten auch komprimieren lassen und bei geringer Bandbreite das Ganze somit beschleunigen:

tar zcpSf - foo | ssh kermit "cd /bar && tar zxpSvf -"

Man kann das Ganze auch umkehren, also Verzeichnisse des entfernten Rechners auf den lokalen kopieren:

ssh kermit tar cSpf - /foo | (cd /bar && tar xpSvf -)

kopiert das Verzeichnis /foo von kermit auf dem lokalen Rechner ins Verzeichnis /bar.

Man kann dem ersten tar-Befehl übrigens auch mehrere Verzeichnisse übergeben. Das eignet sich hervoragend für ein einfaches Backup, insbesondere zusammen mit gzip:

ssh kermit tar cSpf - /foo /bar | gzip -f9 > kermit_backup.tgz

Das sichert die Verzeichnisse /foo und /bar des Rechners kermit als komprimiertes Tar-Archiv in der Datei kermit_backup.tgz auf dem Lokalen Rechner.

Ich mache so täglich Sicherungen von wichtigen Verzeichnissen meiner Server.

Auch hier kann man tar die Komprimierung übernehmen lassen:

ssh kermit tar zcSpf - /foo /bar > kermit_backup.tgz

Diese Variante ist schneller, die andere komprimiert dafür geringfügig besser.

Komplette Verzeichnisbäume verschieben

Ich musste mal wieder ein Verzeichnis von der einen Partition auf eine andere schieben um Platz zu schaffen. Wichtig dabei ist, dass die Rechte der Dateien und Verzeichnisse nicht verändert und Sym-Links korrekt kopiert werden. Dazu kann man sehr gut den tar-Befehl nutzen.

Nehmen wir mal an, wir wollen das komplette Verzeichnis foobar unterhalb von /var nach /usr kopieren, so dass es hinterher als /usr/foobar zu finden ist.
Man wechselt dazu als root in das übergeordnete Verzeichnis der Quelle (hier also nach /var) und gibt den folgenden Befehl ein:

tar cSpf - foobar | ( cd /usr && tar xSpvf - )

Wie man sieht, wird hinter den „cd“ das Zielverzeichnis angegeben.
Der Linke Teil packt das Verzeichnis foobar in einen tar-Stream und gibt ihn auf der Standardausgabe aus (dafür sorgt das – hinter dem f ). Die Parameter S und p sorgen dafür, dass die Rechte unverändert bleiben (p) und dass leere bzw. kleine Dateien effizient übertragen werden (S). Dieser Stream wird dann mit der Pipe (|) an den rechten Teil weitergereicht. Hier wird dann erstmal in das Zielverzeichnis gewechselt und der über die Standardeingabe (wieder f – ) empfangene Stream dort ausgepackt.

Anschließend kann das Quelleverzeichnis gelöscht werden.

Wie das ganze auch über Rechnergrenzen mittels ssh funktioniert zeige ich in einem weiteren Artikel.