0kb Dateien aus Backup wiederherstellen

stefkey

Member
Hallo,

ich habe ein Problem. Alle Dateien mit 0kb sollen aus einem Backup wiederhergestellt werden wobei das Datum des übergeordneten Verzeichnisses erhalten bleiben soll.
Optimal wäre dann noch wenn die Datei nur ersetzt wird wenn diese im Backup auch >0kb ist.

Folgendes Bruchstücke habe ich mir jetzt zusammengesucht:

#!/bin/bash
find /var/www -size 0
findet ich schonmal alle Dateien. Das Backup liegt unter /var/www-org/

touch -r "$DIR" /tmp/TIMESTAMP
cp /var/www/pfad-zur-dateikaputt /var/www-org/pfad-zur-orginaldatei
touch -r /tmp/TIMESTAMP "$DIR"
rm -f /tmp/TIMESTAMP


Kann mir jemand helfen und das zu einem Funktionierenden Script basteln?
 
Hast Du schon einmal eine Schleife mit
Code:
for i in $(find ...); do ...; done
versucht?

Du solltest Dir auch noch basename und dirname ansehen.

---
.A.
 
okay, ich habe mir nun das folgende zusammengestrickt, jedoch weiß ich nicht wie ich den Timestamp das darüberliegenden Ordners sichere. Ich sichere ja nun den Zeitstempel der gefundenen Datei. Wie kann ich aber nun den Zeitstempel des Verzeichnisses sichern indem sich die Datei befindet?
Im Prinzip geht es mir darum das nach dem Austausch der 0kb-Datei das Verzeichniss kein neuen Timestamp hat.

Code:
#!/bin/bash
for DIR in `find /var/www -type f -size 0` 
do
touch -r "$DIR" /tmp/TIMESTAMP
cp /var/www-org/pfad-zur-orginaldatei  /var/www/pfad-zur-dateikaputt
touch -r /tmp/TIMESTAMP "$DIR"
rm -f /tmp/TIMESTAMP
done
exit 0

Ich müsste also die Variable $DIR manipulieren. Oder ist das zu umständlich und es geht auch einfacher? Weiß hierzu jemand Rat?
 
Last edited by a moderator:
Code:
#!/bin/bash
for DIR in `find /var/www -type f -size 0` 
do
touch -r "$DIR" /tmp/TIMESTAMP
cp /var/www-org/pfad-zur-orginaldatei  /var/www/pfad-zur-dateikaputt
touch -r /tmp/TIMESTAMP "$DIR"
rm -f /tmp/TIMESTAMP
done
exit 0
Tu das nicht. Es ist böse, for für Dateinamen zu benutzen! (Insbesondere dann, wenn was injected wird oder deine Dateinamen einfach nur leerzeichen haben.)

Code:
cd /var/www # <-- Das hier, da sonst bei jedem File ein /var/www/ vorne dranhängt und das möchtest du nicht
find -type f -size 0 | while read file
do
  touch -r "$file" /tmp/TIMESTAMP
  cp /var/www-org/"$file" /var/www/"$file"
  touch -r /tmp/TIMESTAMP "$file"
  rm -f /tmp/TIMESTAMP
done
exit 0
 
Problem zutreffend erkannt, aber mit dem Ansatz von Fusi nicht gelöst: Denn das was für Leerzeichen gilt, trifft bei beiden Ansätzen für Zeilenvorschübe zu.

Die Frage ist allerdings, ob eine allgemeine Lösung benötigt wird, oder ob es für den Zweck reicht, vorher nach irregulären Zeichen zu suchen und diese paar Dateien auszuschließen.
 
Problem zutreffend erkannt, aber mit dem Ansatz von Fusi nicht gelöst: Denn das was für Leerzeichen gilt, trifft bei beiden Ansätzen für Zeilenvorschübe zu.
Wer hat denn Zeilenvorschübe in Dateinamen? Ach egal:

Die Frage ist allerdings, ob eine allgemeine Lösung benötigt wird, oder ob es für den Zweck reicht, vorher nach irregulären Zeichen zu suchen und diese paar Dateien auszuschließen.
Normalerweise sollte ein inverse-grep reichen. Was sagt denn nur ein `find /var/www -type f -size 0`? Eventuell hier oder per PM posten, wenn du's nicht öffentlich haben willst.
 
Hallo,

danke für die Antworten. Ich würde das Script nur einmalig ausführen und sofort wieder löschen. Von daher würde ich mal sämtliche Sicherheitsaspekte ausßen vor lassen - zumindest für meinen speziellen Fall.

Ich habe mit basename und dirname angeschaut - danke .A.

Und wie kann ich einen Pfad dahingehend manipulieren das zB aus /var/www -> /volume/backup/var/www
 
Danke .A.

Nun habe habe ich etwas gebastelt und ich stehe vor folgendem Problem.
find spuckt zB /Volumes/squeeze/var/www/test.html aus.

Dh im Script muss aus:
/Volumes/squeeze/var/www/test.html

dieses:
/Volumes/Backup/vs/20130402/var/www/test.html

werden.

Mit basename oder dirname komme ich da nicht weiter. Und vor dem Pfad etwas ergänzen wie in meiner vorigen Frage angenomme passt auch nicht.

Hat jemand einen Tip?
 
Back
Top