• 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] inkrementelle backups mittels tar und find

kwinkler

Newbie
Hallo Liebe Experten, lese mich gerade etwas bei Linux ein und teste ein paar Kommandos.

Ich komme leider nicht weiter und etwas entsprechendes habe ich hier im Linux-Club noch nicht gefunden - wenn doch etwas zu dem Thema gefunden werden kann, bitte sendet mir die entsprechenden Links.

Okay fangen wir an .....

----------------------------------
mit

find /home/benutzer/Documents -type f -mtime -4

findet genau 3 Dateien - diese sollen nun als ein inkrementelles Backup in ein gzip-file gesichert werden.

Mit dem Befehl

find /home/benutzer/Documents -type f -mtime -4 -exec tar -Pcf backup.tar {} \;

wird leider nur eine statt drei Dateien gespeichert :(
Wo liegt der Fehler? Eventuell bei tar selbst?

Freue mich auf Eure Hilfe

Beste Grüsse

[Suchwörter - incrementell, backup]
 

gameboy

Hacker
Hallo kwinkler,

wenn ich Dich richtig verstehe, willst Du mit tar Backups anfertigen. Davon würde ich Dir abraten (siehe u.a. hier: http://suse-linux-faq.koehntopp.de/q/q-backup-nicht_targz.html). Es gibt sicher zahlreiche Alternativen, persönlich empfehlen würde ich das rsync-basierte rsnapshot.

Viele Grüße,
gameboy.
 
OP
K

kwinkler

Newbie
gameboy schrieb:
Es gibt sicher zahlreiche Alternativen, ... rsync-basierte rsnapshot.
framp schrieb:
Hast Du Dich hier mal ein wenig umgesehen bzw gelesen?

Vielen Dank "gameboy" und "framp", ja habe ich gelesen; nur war das nicht meine Frage und auf diesen Seiten ist auch keine Antwort auf meine Frage zu finden.

Ich brauche Hilfe zu "tar" und nicht was ist besser oder geeigneter, oder, oder, oder ........... ;-)

Bitte helft mir in der Sache:

>-------<

Befehl

find /home/benutzer/Documents -type f -mtime -4

findet genau 3 Dateien - diese sollen nun als ein inkrementelles Backup in ein gzip-file gesichert werden.

Mit dem Befehl

find /home/benutzer/Documents -type f -mtime -4 -exec tar -Pcf backup.tar {} \;

wird jedoch nur eine statt drei Dateien gespeichert :(
Wo liegt der Fehler?

Freue mich auf Eure Hilfe
 
A

Anonymous

Gast
kwinkler schrieb:
Mit dem Befehl

find /home/benutzer/Documents -type f -mtime -4 -exec tar -Pcf backup.tar {} \;

wird jedoch nur eine statt drei Dateien gespeichert :(
Wo liegt der Fehler?

Ein Fehler direkt ist das nicht, das sind ein paar Eigentümlichkeiten von find
am besten den Befehl umdrehen
Code:
 tar -Pcf backup.tar `find /home/benutzer/Documents -type f -mtime -4`

Wenn es richtig komplizierte Dateinamen werden (aber die verwendet ja niemand :wink: :oops: ), dann kann es auch noch notwendig werden mit "Null Separierten Dateinamen" zu arbeiten.
info:/tar/nul


robi
 
OP
K

kwinkler

Newbie
robi schrieb:
Ein Fehler direkt ist das nicht, das sind ein paar Eigentümlichkeiten von find am besten den Befehl umdrehen
Code:
 tar -Pcf backup.tar `find /home/benutzer/Documents -type f -mtime -4`

Wunderbar! Läuft mit Eigentümlichkeiten.

Eigentümlichkeit:
Es werden ausschlieslich Dateien ins tar mitgenommen, die kein Leerzeichen im Dateinamen aufweisen, Dateien mit Leerzeichen im Dateinamen werden nicht miteingepackt (Fehlermeldungen). Werden den Dateinamen die Leerzeichen entnommen, werden alle Dateien gefunden und sauber gepackt.

Auf noch was interessantes wurde ich aufmerksam, die Grösse der Datei, mit den fehlenden Dateien war absolut identisch von der Grösse her, wie die Datei in denen alle Dateien enthalten sind - Kontrolle ist beim testen unumgänglich ...

Wichtige Frage:
Wie können dennoch Dateien mitgepackt werden, die Leerzeichen enthalten? Mir ist in Tests aufgefallen, dass wenn ich nun mein homeverzeichnis incrementell sichern will, mein Script gestoppt hat. Wahrscheinlich ist es erforderlich, mit "Null Separierten Dateinamen" zu arbeiten? Wie gehe ich da am besten vor?



PS: Leider ist mir als Linuxeinsteiger (von WINDOOF kommend) nicht bewusst, dass Leerzeichen im Dateinamen tunlichst vermieden werden sollte - ab jetzt werden Dateinamen nur noch ohne Leerzeichen verwendet.
 

joka

Member
kwinkler schrieb:
robi schrieb:
Ein Fehler direkt ist das nicht, das sind ein paar Eigentümlichkeiten von find am besten den Befehl umdrehen
Code:
 tar -Pcf backup.tar `find /home/benutzer/Documents -type f -mtime -4`
Wunderbar! Läuft mit Eigentümlichkeiten.
Dieses Kommando ist nur nicht wg. Leerzeichen und anderer Sonderzeichen problematisch, die Anzahl der Argumente die einem Programm übergeben werden können, ist auch nicht unbegrenzt.
Man kann tar aber eine Datei mit einer Liste von Dateinamen übergeben, die find erzeugen kann. Dafür ist die Option -T vorgesehen. Statt von einer Datei kann tar -T die Dateiliste auch von der Standardeingabe lesen, so dass find und tar mit einer Pipe verknüpft werden können. Dann klappt's auch mit Leerzeichen:
Code:
find /home/benutzer/Documents -type f -mtime -4 | tar -Pcvf backup.tar -T-
# oder komprimiert
find /home/benutzer/Documents -type f -mtime -4 | tar -zPcvf backup.tgz -T-
Schau Dir auch backup2l an (siehe Wiki/Backup). Das ist ein (umfangreiches) Shellscript, das inkrementelle automatische Backups mit Hilfe von tar und find implementiert.
 
OP
K

kwinkler

Newbie
joka schrieb:
Code:
find /home/benutzer/Documents -type f -mtime -4 | tar -Pcvf backup.tar -T-
# oder komprimiert
find /home/benutzer/Documents -type f -mtime -4 | tar -zPcvf backup.tgz -T-
Schau Dir auch backup2l an (siehe Wiki/Backup). Das ist ein (umfangreiches) Shellscript, das inkrementelle automatische Backups mit Hilfe von tar und find implementiert.

Sehr professionell; werde Deinen Tipp testen, und danach ein kl. Statement und wenn ich darf ein "Manual bzw. Tutorial" beisteuern.
 
Das hätte die Suche auch zu Tage gefördert ABER NEIN...
http://www.linux-club.de/viewtopic.php?t=84316&highlight=mtime+tar+xargs
 
OP
K

kwinkler

Newbie
jengelh schrieb:
Das hätte die Suche auch zu Tage gefördert ABER NEIN...
http://www.linux-club.de/viewtopic.php?t=84316&highlight=mtime+tar+xargs

Die beiden Links im angegebenen Topic sind zwar nicht erreichbar, aber der Befehl

Code:
find /input ! -mtime $[5*24] -print0 | xargs -0 tar -T- --null --no-r -cvjf /tmp/output.tar.bz2

ist sensationell. Hervorragend! xargs kannte ich ich noch nicht - xargs erstellt Kommandozeilen und führt diese aus, sehr schön.

Vielen Dank
Beste Grüsse und einen sonnigen Tag
Karsten Winkler
 
EDIT:
Code:
find /input ! -mtime $[5*24] -print0 | tar -T- --null --no-r -cvjf /tmp/output.tar.bz2
Ohne xargs hier! tar soll ja einmal und nicht mehrmals ausgeführt werden, und darüberhinaus die Dateiliste über stdin erhalten (-T-) statt als Argumente... sry mistake.
 
OP
K

kwinkler

Newbie
S C H L U S S B E M E R K U N G

Liebe Linux-Gemeinde

Als Dank für Eurer Hilfe kann ich Euch nun zeigen, dass durch Eure Hilfe ein wunderbares BackupScript entstanden ist, wodurch es möglich wurde, vom Notebook Backups durchzuführen.

Aufgabe war es ein Script zu schreiben, das inkrementelle Backups sicher über das lokale LAN ohne NFS schreibt.

Hier das increment.sh (einige Leute werden hier Teile ihre Codes wiederfinden ;-))

Code:
#!/bin/sh

########## Configuration ############

BACKUPFILES="/home/user"       # zu sichernde Verzeichnisse
REMOTE="192.168.1.22"                        # Rechner auf den gesichert wird
REMOTEUSER="backup"                         # User, auf den via ssh ohne Passwort zugegriffen wird
REMOTEDIR="/home/backup/"                   # Backup-Verzeichnis auf Remote-Rechner
AGE="-1"                                    # -1 = Nicht aelter als 24 Stunden, -2 = 48 ...
MAILTO="./backup.mail"                      # Mailadressen, die im Error-Fall Mail erhalten
SUBJECT="Backup_fehlgeschlagen!"            # im Subject kein Leerzeichen!
ERROR="./error.txt"                         # Text, der im Error-Fall versandt wird

DATE=`/bin/date +%Y%m%d`                    # Datum im Format YearMonthDay
HOST=`/bin/hostname`

TAR=/bin/tar
FIND=/usr/bin/find
TAROPTIONS="-c"
SSH=/usr/bin/ssh
CAT=/bin/cat
GZIP=/usr/bin/gzip
MAIL=/usr/bin/mail

REMOTEFILE="incremental_$HOST".$DATE."tgz"  # Dateiname der Backup-Datei
CHECK_REMOTE=`ping -c1 $REMOTE | grep packet | awk '{print $4}'` # gibt 1 (online) oder 0 (offline) zurueck

#####################################

if [ $CHECK_REMOTE == 1 ]; then
 $FIND $BACKUPFILES -mtime $AGE -print0 | tar -T- --null --no-r $TAROPTIONS | $GZIP | $SSH $REMOTEUSER@$REMOTE "cat > $REMOTEDIR$REMOTEFILE"

else
 $CAT $MAILTO | while read line
      do
                $MAIL $line -s $SUBJECT < $ERROR
      done
fi
#Ende des Scriptes

Das war natürlich nur mein incrementelles backup, welches sich vom vollbackup.sh etwas unterscheidet.
Wenn der Wunsch und das Interesse besteht, veröffentliche ich gerne beide Scripts mit einer kleinen Doku ... denn auf dem Fileserver muss vorher ein Benutzer eingerichtet werden, auf dessen Dateien niemand (ausser Superuser) und ausschliesslich RootClients entfernter Rechner zugreifen können.

Allerdings fallen mir noch weitere Verbesserungsmöglich ein, um auch Rechnerausschaltzeiten (verursacht durch Ferienzeiten etc.) zu berücksichtigen. Die werde ich in etwa 10 Tagen nach meinen Ferien als Frage hier ins Forum posten ... bis dann schöne Tage ...

Have fun, Euer kwinkler
 
Oben