Dateien kopieren
Kopp
- webserver
0 ritschmanhard0 Kopp0 Kopp0 Kopp
0 Kopp0 ritschmanhard0 ritschmanhard0 ritschmanhard0 Kopp
Hallo!
Ich möchte alle Dateien von unserem alten Windows-Fileserver (Windows Freigabe nicht mehr, nicht weniger :-) ) auf unseren neuen Linux-File-Server kopieren.
Doch bereits nach drei Sekunden Kopiervorgang, egal ob mit dem MC oder
srv:~# cp /mnt/hdb/ /home/share/
wurde mir bei bestimmten Dateien ein Lese-Fehler als Grund genannt die Datei nicht kopieren zu können.
Ich hab mir nun folgendes gedacht:
Ich würde gerne die Dateien Kopieren die zu kopieren gehen und alle Fehlermeldungen und NUR die Fehlermeldungen der nicht kopierten Dateien in eine log.txt zu schreiben. Oder, wenn ich mich darauf verlassen könnte, wäre es auch eine Variante Alle Dateien zu kopieren und auf dem Quelllaufwerk anschließend zu löschen. Defekte Dateien würden zurück bleiben und ließen sich evtl mit einem anderen Programm reparieren.
Meine Fragen:
Wie würdet ihr das anstellen?
Wie würden die befehle aussehen?
Welche Programme reparieren defekte Dateien?
Kopp
Hi Kopp!
Also, ich würde mal folgendes probieren (!ungetestet, at your own risk!):
(1)srv:~# echo -n "" > /home/share/copyErr.txt
(2)srv:~# find /mnt/hdb/ -type f -exec cp '{}' /home/share/ 2>>/home/share/copyErr.txt ;
Anweisung 1 resettet/erzeugt eine Datei für deine Fehlersammlung
Anweisung 2 liest alle Dateien in /mnt/hdb/ und führt für jede Datei einzeln den Copy Befehl aus; Fehlermeldungen werden in der erzeugten Datei abgelegt.
Viele Grüße,
Richard
Moje,
(1)srv:~# echo -n "" > /home/share/copyErr.txt
ist klar
(2)srv:~#
find /mnt/hdb/ -type f -exec cp '{}' /home/share/ 2>>/home/share/copyErr.txt ;
Hab Fragen zur Syntax:
wofür steht -type f?
wofür '{}'
warum 2>> und nicht einfach >
; am ende nötig?
Danke!
Hi!
wofür steht -type f?
das bedeutet, dass nur files kopiert werden sollen - sonst würde cp auf alle Verzeichnisse UND alle Dateien ausgeführt, was nicht im Sinne des Erfinders wäre.
wofür '{}'
{} steht für "das Ergebnis" von find, d.h. wenn Bsp. 3 Dateien namens 1.txt, 2.txt und 3.txt in deinem Quellverzeichnis waren, so nimmt {} nacheinander die Werte 1.txt 2.txt und 3.txt an. Die '' drum rum sind, falls blöderweise ein Dateiname einen blank enthält.
warum 2>> und nicht einfach >
Weil der Befehl für jede Datei neu ausgeführt wird. Somit würde mit > nur das Ergebnis des letzten cp Aufrufs in der copyErr.txt stehen, durch >> wird für jeden neuen Aufruf an copyErr.txt angehängt.
; am ende nötig?
hast ja selbst gemerkt ;-)
Ansonsten: man find auf Konsole gibt dir alles aus, was find kann.
Danke!
No Prob, Grüße,
Richard
(1)srv:~# echo -n "" > /home/share/copyErr.txt
(2)srv:~# find /mnt/hdb/ -type f -exec cp '{}' /home/share/ 2>>/home/share/copyErr.txt ;
find: Fehlendes Argument für "-exec"
Was da los?
Kopp
find: Fehlendes Argument für "-exec"
Was da los?
Sorry habe das ; vergessen. Womit schon mal die Frage geklärt wäre ob es nötig ist :-)
Kopp
Hi Kopp!
Also, ich würde mal folgendes probieren (!ungetestet, at your own risk!):
(1)srv:~# echo -n "" > /home/share/copyErr.txt
(2)srv:~# find /mnt/hdb/ -type f -exec cp '{}' /home/share/ 2>>/home/share/copyErr.txt ;
Zerreißt die ganze Ordnerstruktur! So werden alle Dateien zwar kopiert und Fehlermeldungen erzeugt wie gewünscht, aber eben alles direkt in den odner /home/share/ ohne Ordner mit zu kopieren!
Desweiteren brauche ich für den 2. durchlauf eine befehl um alle erfolgreich kopierten Dateien zu löschen. Dann muss ich nicht so viel Suchen ;-)
Kopp
Hi Kopp!
Zerreißt die ganze Ordnerstruktur! So werden alle Dateien zwar kopiert und Fehlermeldungen erzeugt wie gewünscht, aber eben alles direkt in den odner /home/share/ ohne Ordner mit zu kopieren!
Schade, dann müßte man ein kurzes Bash script erstellen:
find /mnt/hdb/ -type f -exec cpPath.sh '{}' /home/share/ 2>>/home/share/copyErr.txt ;
cpPath.sh:
#!/bin/bash
#hier das Bash script
Dauert ein kleinen Moment. Die Lösung deines Remove Problems besteht darin, cp durch mv zu ersetzen - allerdings bitte ich dich noch kurz zu warten, da ich dann ein Script zusammen habe, dass die Verzeichnisse mit kopiert.
Bis nachher,
Richard
Hi Kopp!
Nun also die Lösung:
Fehlerdatei zurücksetzen wie gehabt (echo -n "" > /home/share/copyErr.txt)
cpPath.sh:
###############################
#!/bin/bash
thePath=echo "$1" | awk -F'/' '{count=0; while (count++<NF-1) {printf("%s/", $count)}; printf("\n")}'
theFile=echo "$1" | awk -F'/' '{print $NF}'
theDest=$2
mkdir -p "$theDest/$thePath"
mv "$1" "$theDest/$thePath" 2>"$3"
##############################
Anleitung: den code zwischen ########## kopieren und als cpPath.sh speichern.
Als nächstes in das Verzeichnis gehen, in dem cpPath.sh gespeichert wurde.
Dort: chmod +x ./cpPath.sh
Dort dann:
find /mnt/hdb/ -type f -exec ./cpPath.sh '{}' /home/share/ /home/share/copyErr.txt ;
Das Problem mit mv ist, dass man nur einen Versuch hat, da das Original "verschoben" wird... - das Risiko liegt also weiter bei dir - alle Angaben ohne Gewähr.
Viele Grüße,
Richard
Hi Kopp!
Der Fehlerteufel:
mv "$1" "$theDest/$thePath" 2>"$3"
muss heissen:
mv "$1" "$theDest/$thePath" 2>>"$3"
Grüße,
Richard
Hi Kopp!
Guden,
habe vorhin schon mal ein
cp -R /.../ /home/share/ 2>> /../Err.txt
ausgeführt.
und in der Err.txt sind fast 100 Eingabe-/Ausgabefehler
Mein Kollege wirft mir vor, dass die Dateien erst beschädigt seien seitdem ich hier rum machen würde, also mit dem Kopieren angefangen habe.
Eigentlich kann das doch gar nicht sein, oder?
Ich habe die HDD als Read-Only im Linux eingehängt und via Externes USB Gehäuse... Eigentlich ist es unmöglich das es an mir liegt, dass die Dateien seit "kurzem" beschädigt sind, oder?
Naja zurück zum Thema :-)
Ich finde kein Freeware-Tool mit dem ich Dateien reparieren kann. Immer nur Spezial-Tools für Excel oder für JPG.. Das nervt!
Ich müsste folgende Formate wiederhestellen:
JPG, PSD, EPS, EXE, RAR, SXW, SWI, PDF, TIF, PPT, AVI, ODT
Die wichtigsten wären erstmal SXW.. Dafür benutze ich auch von mir aus ein Spezial-Tool. Kennt da jmd eins?
Oder generell: Kennt jmd ein Tool für die genannten Formate?
Kopp