• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst]mit tar für jeden Unterordner ein archiv erstellen ?

moe

Member
Hallo,

ich würde gerne Home-Laufwerke, mailboxen etc. per tar/gz-Backup
Komprimieren und dabei automatisch für jeden Unterordner also
jedes Home-Laufwerk bzw. mailbox jeweils eine tar-Datei
erstellen lassen. Ich möchte natürlich nicht für jedes eine extra Zeile
im Backupscript eintragen.

Ich hatte vor Jahren mal so ein script gebastelt welches erst das Verzeichnis ausliest und in eine Datei schreibt und die Datei wurde dann mit sed
noch etwas modifiziert ... das ganze war relativ aufwändig und finde ich 1.
im moment nicht und 2. denke ich das es etwas einfacheres geben müsste.

Muss doch ein Standard-Problem sein ? oder ?

Weiß jemand wie soetwas mit einfachen (Board)-Mitteln zu bewerkstelligen
ist ?
 

spoensche

Moderator
Teammitglied
also wenn ich das jetzt richtig verstanden habe willst du für jeden unterordner in deinem home verzeichnis ein eigenes archiv.

Code:
#!/bin/sh

for directory in $(find /home/username -maxdepth 1 -type d); do
     tar -czf $directory-$(date +%d%m%Y).tar.gz $directory
done

das script packt jedes verzeichnis der 1. ebene samt deren unterverzeichnis in ein einzelnes archiv, das den verzeichnisnamen als archiv und zusätzlich noch das datum der sicherung im namen beinhaltet.

die archive werden in dem verzeichnis abgelegt, von wo du das script aufrufst.
ein bisschen arbeit sollst du ja auch haben.;)

was ist mit den einzelnen dateien, die in keinem unterverzeichnis liegen?
 
OP
moe

moe

Member
Hallo spoensche,

Das sieht schon sehr sehr gut aus !

Leider gibt es noch ein kleines Problem : der find Befehl nimmt auch den
oberordner mit d.h. wenn ich z.B. folgende Struktur habe:

/home/user1
/home/user2
/home/user3

dann müsste ich ja hinter dem find
/home/
eintragen.

Aber dann erhalte ich folgende archive:

user1.tar.gz
user2.tar.gz
user3.tar.gz
home.tar.gz

natrülich möchte ich nicht das home.tar.gz sondern nur die anderen...
Also müsste ich noch den Oberordner irgendwie filtern ?!?

Ausserdem würde ich gerne auch noch bestimmte (fest definierte) Ordner ausschliessen also eine art Filterliste einrichten.
In der filterliste könnte man ja auch das mit dem Oberordner gleich mit rausfiltern...?!?

Hast Du dafür vielleicht noch einen Denkanstoss ?

Ansonsten schon mal Vielen Dank für das Scriptschnipsel !!

edit: die einzelnen Dateien sind in diesem Falle kein Problem da dort keine liegen
werden.
 
OP
moe

moe

Member
spoensche schrieb:
ändere folgendes:

Code:
-maxdepth 1 in -maxdepth 2

Ich glaube Du hast mich missverstanden.
Wenn ich es so ändere bekomme ich ja eine zusätzliche Ordnerebene.

Ich wollte aber eigentlich nur die Unterordner z.b. von "/home" und nicht die
Unterordner der einzelnen User. wenn ich es aber mit -maxdepth 1
mache dann bekomme ich ja auch den Homeordner selbst.
Das würde heissen das er mit alle Home-Laufwerke einzeln komprimiert und zusätzlich nochmal alle home-Laufwerke in _eine_ Datei.

Edit : Ja, natürlich ... es geht mit -mindepth 1
 
OP
moe

moe

Member
OK, soweit so gut.
Nun such ich noch eine einer Möglichkeit für eine art Filterliste.
Beispiel:

/home/user1
/home/user2
/home/user3

ich möchte aber den Ordner von User2 nicht sichern sondern nur alle anderen. Könnte man so etwas in einfacher form dort noch mit einbasteln?

Eventuell auch über eine separate exclude-datei.
Er müsste quasi bevor er den tar -Befehl ausführt vermutlich nochmal
in einer Schleife überprüfen ober der jeweilige Ordner in der excludeliste
enthalten ist.

Wie könnte man das am elegantesten lösen ?
 

spoensche

Moderator
Teammitglied
eine variable für die exclude datei angeben:

Code:
exclude_dirs="/pfad/zur/exclude/datei"

in der exclude datei für jedes verzeichnis eine zeile also z.B. so:
Code:
/home/user1
/home/user3

dann dem tar aufruf folgendes mitgeben:

Code:
tar --exclude-from $exclude_dirs und den rest hinten dran packen

ein lesen der man page von tar hätte dir das auch gesagt. nur nicht so lese faul sein.
 
OP
moe

moe

Member
so nun habe ich noch ein bischen gebastelt und hier ist das ergebnis:

Code:
bakdir="/home";
bakdirlength=${#bakdir};
destdir="/dort/soll/es/hin";
exclude="/pfad/zur/excludedirs";

    for directory in $(find $bakdir -maxdepth 1 -mindepth 1  -type d); do
    dirname=${directory:$bakdirlength}
    tar -X $exclude -czf $destdir$dirname.tgz $directory 
    done

Das funktioniert soweit schon sehr gut.
Einen winzigen Schönheitsfehler gibt es noch ( mit dem ich notfalls auch leben kann):

Die Verzeichnisse welche in der excludedirs-datei stehen werden zwar
nicht komprimiert aber trotzdem wird für jedes dieser Verzeichnisse
eine .tgz datei angelegt welche genau 45 bytes groß ist und diese ist komplett leer.

Habe schon diverse Sachen probiert und dies zu verhindern...

Wie könnte man diesen Schönheitsfehler noch beheben ?

in jedem Fall erstmal Vielen Dank an Dich, spoensche !
 

spoensche

Moderator
Teammitglied
das liegt an der for schleife, dass er für die verzeichnisse trotzdem ein tar.gz archiv anlegt.

du könntest aber mit einer 2. for schleife nach der abarbeitung der ersten for schleife diese wieder löschen. das ist zwar nicht gerade die eleganteste lösung.

Code:
for dirrm in $(cat $exclude); do
    rm $destdir$dirrm.tar.gz
done
 
OP
moe

moe

Member
Ok, werde ich mal probieren.
Wie gesagt, sonst wäre es auch nicht sooo schlimm ...

In jedem Falle vielen Dank nochmals !

... dann kann hier ---> zu !
 
Oben