Diese Website existiert nur weil wir Werbung mit AdSense ausliefern.
Bitte den AdBlocker daher auf dieser Website ausschalten! Danke.

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

Alles rund um die Systemverwaltung, die Administration und Konfiguration Eures Linuxsystems

Moderator: Moderatoren

Antworten
Benutzeravatar
moe
Member
Member
Beiträge: 114
Registriert: 20. Apr 2004, 21:07
Wohnort: Tuxtown
Kontaktdaten:

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

Beitrag von moe » 17. Mär 2008, 16:43

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 ?
Zuletzt geändert von moe am 19. Mär 2008, 14:18, insgesamt 1-mal geändert.
mfg moe

Werbung:
spoensche
Moderator
Moderator
Beiträge: 7376
Registriert: 30. Okt 2004, 23:53
Wohnort: Siegen

Beitrag von spoensche » 17. Mär 2008, 17:14

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

Code: Alles auswählen

#!/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?

Benutzeravatar
moe
Member
Member
Beiträge: 114
Registriert: 20. Apr 2004, 21:07
Wohnort: Tuxtown
Kontaktdaten:

Beitrag von moe » 17. Mär 2008, 20:52

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.
mfg moe

spoensche
Moderator
Moderator
Beiträge: 7376
Registriert: 30. Okt 2004, 23:53
Wohnort: Siegen

Beitrag von spoensche » 18. Mär 2008, 08:45

ändere folgendes:

Code: Alles auswählen

-maxdepth 1 in -maxdepth 2

Benutzeravatar
moe
Member
Member
Beiträge: 114
Registriert: 20. Apr 2004, 21:07
Wohnort: Tuxtown
Kontaktdaten:

Beitrag von moe » 18. Mär 2008, 16:11

spoensche hat geschrieben:ändere folgendes:

Code: Alles auswählen

-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
mfg moe

Benutzeravatar
moe
Member
Member
Beiträge: 114
Registriert: 20. Apr 2004, 21:07
Wohnort: Tuxtown
Kontaktdaten:

Beitrag von moe » 18. Mär 2008, 16:22

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 ?
mfg moe

spoensche
Moderator
Moderator
Beiträge: 7376
Registriert: 30. Okt 2004, 23:53
Wohnort: Siegen

Beitrag von spoensche » 18. Mär 2008, 17:18

eine variable für die exclude datei angeben:

Code: Alles auswählen

exclude_dirs="/pfad/zur/exclude/datei"
in der exclude datei für jedes verzeichnis eine zeile also z.B. so:

Code: Alles auswählen

/home/user1
/home/user3
dann dem tar aufruf folgendes mitgeben:

Code: Alles auswählen

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.

Benutzeravatar
moe
Member
Member
Beiträge: 114
Registriert: 20. Apr 2004, 21:07
Wohnort: Tuxtown
Kontaktdaten:

Beitrag von moe » 19. Mär 2008, 12:49

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

Code: Alles auswählen

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 !
mfg moe

spoensche
Moderator
Moderator
Beiträge: 7376
Registriert: 30. Okt 2004, 23:53
Wohnort: Siegen

Beitrag von spoensche » 19. Mär 2008, 13:33

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: Alles auswählen

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

Benutzeravatar
moe
Member
Member
Beiträge: 114
Registriert: 20. Apr 2004, 21:07
Wohnort: Tuxtown
Kontaktdaten:

Beitrag von moe » 19. Mär 2008, 14:17

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 !
mfg moe

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste