ist rm -r fuer ein ufs-filesystem fuer die ewigkeit?

Status
Für weitere Antworten geschlossen.
hi,

ich habe ein free-bsd5.4-system mit einer mainpartition formatiert in ufs. peinlicherweise habe ich folgendes kommando ausgefuehrt

Code:
rm -r * /mnt/marla/

Man beachte den Asterisk... Ich weiss nicht, wie der dahin kam.

Ist es moeglich die Daten zu retten?

Es gibt wohl ein GNU-Programm testdisk, das kann ich zur zeit nicht installieren, da ich auf Reisen bin. Hat jemand Erfahrung mit diesem Problem? Ich wuerde mich auch bereiterklaeren ein kleines undelete-programm zu schreiben... Habe das schon getan mit der <unistd.h> bibliothek, aber das funktioniert nicht.

Code:
char[1] path;

path='/'

int
undelete (char path_src) {
   path_src=path;
   undelete (path);
}

Ich hoffe der Code ist richtig, habe meinen Rechner nicht in der Naehe und somit keinen c-compiler.

Waere einer Antwort sehr verbunden. Dies ist meiner erster Eintrag in diesem Forum, deshalb hoffe ich nix falschgemacht zu haben.

ciao
 
agır_c_cmbattr schrieb:
Hat jemand Erfahrung mit diesem Problem

Ja, ich lösche so meine Daten immer!

Es wäre mir neu, dass du an die Daten noch mit normalen Mitteln rankommst.
Ich hoffe der Befehl war nicht in einem wichtigen Systemordner?

Gruß und Mitleid

Frank
 
Die Daten sind wahrscheinlich noch da, beim unlink(2) wird nur der I-Node angefasst.

Gerüchteweise ist das Problem aber, dass UFS dazu tendiert, genau die freien Blocks für neue Daten wiederzuverwenden, die als letztes frei wurden. LIFO bei den freien Blöcken also.

Wenn Du also direkt nach dem Löschen die Partition per umount aus dem Verzeichnisbaum rausnimmst, hast Du gute Chancen, Teile der Daten wieder herstellen zu können.

Um die Dateistruktur wieder herstellen zu können, müsstest Du einen Datenretter bemühen, der die I-Nodes wiederherstellt. Diese Leute verlangen aber i.A. richtig dickes Geld.
 
Wie andere schon schrieben: Normalerweise heißt gelöscht, daß die Daten weg sind. Nach einem versehentlichen rm(1) muß man schnell reagieren: Strom weg! Dazu ist es aber jetzt wohl sowieso zu spät, da die Datenblöcke vermutlich teilweise schon wieder zugeteilt wurden.

Wenn man aber schnell genug war, macht man erstmal ein Image von der Platte. Über dieses Image läßt man dann einen fsck laufen. Waren auf dem Dateisystem Soft-Updates aktiv, sind vielleicht viele Dateien sogar noch mit ihrem Dateinamen vorhanden. Ansonsten sollte man die meisten unter lost+found wiederfinden, bei denen ist dann aber der ursprüngliche Dateiname nicht mehr da. Das Problem ist dann auch, daß u.U. einiges an Schrott wieder hochkommen kann.

Sollte der vorherige Schritt nicht erfolgreich gewesen sein, wird's echt teuer. Datenrettungsunternehmen verlangen IIRC 10 TEuro und aufwärts.

Vincent Vega schrieb:
Um die Dateistruktur wieder herstellen zu können, müsstest Du einen Datenretter bemühen, der die I-Nodes wiederherstellt.
Ich bezweifele, daß der die Dateistruktur wieder hinbekommt. Allerdings ist es für solch ein Unternehmen ein Klacks, die Datenblöcke wiederherzustellen. Nur Datei- und Verzeichnisnamen dürften eher nicht mehr reparabel sein.

Um so etwas selbst zu machen, benötigt man aber Kenntnisse über die Interna von UFS. Der Code-Schnippsel, den der OP da präsentiert, ist ziemlich naiv. Der funktioniert mit Sicherheit nicht, braucht ihr gar nicht ausprobieren. Der Source von fsck sollte, UFS-Kenntnisse vorausgesetzt, die nötigen Code-Teile aber liefern können.

Das alles gibt einem aber nicht die Garantie, daß man am Ende tatsächlich alle seine Daten wiederbekommt. Ich würde daher empfehlen, mit rm(1) einfach vorsichtiger umzugehen. Das sagt sich hinterher natürlich leicht, aber für die Zukunft sollte man vorsorgen, z.B. mit einem alias.
 
Moin,

vielleicht gibt es doch eine Möglichkeit die Daten zu retten.
Du führst ein "umount" durch bzw. nimmst die Fixit-CD, aber die Festplatte nicht mounten.
Anschließend schreibst Du mittels dd ein Abbild der kompletten Festplatte in eine Datei auf einer zweiten Platte oder DVD-RAM: dd if=/dev/ad0s1 of=/backup.file .

Nun kannst Du mit einem Editor die für Dich wichtigen (Text-)Daten noch extrahieren. So hatte ich schon ein paar mal versehentlich gelöschte Daten zurückgeholt.

Damit es nicht wieder passiert kannst Du auch folgenden Trick anwenden:
rm umbenennen nach rm.old
ein Skript schreiben, das alle zu löschende Dateien in ein separates Verzeichnis VERSCHIEBT
Aus diesem Verzeichnis heraus kannst Du bei einem versehentlichen Löschen alles wieder "zurück-VERSCHIEBEN" oder mit rm.old entgültig löschen.

Viele Grüße

Jürgen
 
Die Daten sind mit Sicherheit noch da, da UFS keine Datenbloecke loescht, sondern nur die Inodes. Das Problem liegt also nur darin, das Puzzle wieder zusammenzusetzen.
Wenn die Daten recht klein waren, und du deren Struktur kennst, dann hast du Glueck. Es gibt einige recover-tools in den Ports, welche zB alle jpeg-Dateien wiederfinden.
Bei Dateien die etwas groesser sind, werden die ueblicherweise ueber die Platte verteilt, hier hast du gelitten.
 
...wieder zurueck in europa ;)

erstmal danke an alle fuer die schnelle antwort. hab gleich danach den strom gekappt gehabt ...vielleicht besteht hoffnung...

auch danke fuer die tips zum loeschen, auch wenn es am ego kratzt. ich loesche normalerweise schon mit rm, aber erst nach einem listing. dafuer hat man ja die history. aber man macht halt irgendwann mal fehler.

Code:
ls /foo
rm -r !$

klar war der code ziemlich naiv, aber es waere zu schoen, wenn alles mit einer funktion aus einer bibliothek zu loesen waer ;) manchmal hift traeumen.

ciao
 
Ein "set rmstar" wird Dir nächstes Mal das Leben retten.

Manchmal hilft auch schon der alte "touch -- -i"-Trick.
 
Oder man erstellt ein Alias von "rm -I" auf "rm".
Ist zwar etwas umständlich (besonder bei Ordnern mit vielen Unterordnern und Dateien), aber sicherer.
 
Der Schalter dafür ist -i, nicht -I. Wenn einem das bei großen Verzeichnissen lästig wird, kann man auf der Kommandozeile den Schalter -f übergeben. Dieser überschreibt -i. Dann sollte man sich aber wirklich sicher sein, daß man das richtige Verzeichnis erwischt hat. Wobei man sich dabei eigentlich so oder so sicher sein sollte. ;)
 
Wenn man einfach einen Ordner Trash im Homeverzeichnis anlegt und ein kleines sh script, naja gut script würd ich das gar nicht nennen, macht in dem folgendes steht

Code:
#!/bin/sh
/bin/mv $* ~/Trash

Das script dann unter /bin/rm speichern und das alte rm umbenennen

Würd das nicht so ne art Papierkorb sein?

Oder vielleicht noch mit ner if schleife schaun ob der Ordner existiert und ggf. erst erstellen
 
Zuletzt bearbeitet:
Ich hab jetzt mal ne Frage.

Ich habs jetzt so geändert:

Code:
#!/bin/sh
                            
if /bin/test -e ~/Trash; then
/bin/mv $* ~/Trash
else
/bin/mkdir ~/Trash && /bin/mv $* ~/Trash
fi

So sollts gehen?
 
Zuletzt bearbeitet:
whopper schrieb:
Ich hab jetzt mal ne Frage.

Ich habs jetzt so geändert:

Code:
#!/bin/sh
                            
if /bin/test -e "~/Trash"; then
/bin/mv "$*" ~/Trash
else
/bin/mkdir ~/Trash && /bin/mv "$*" ~/Trash
fi

Ich weiss nicht wo der Fehler liegt, aber versuch mal:

Code:
#!/bin/sh
                            
if [ ! -e "~/Trash" ] ; then
mkdir ~/Trash
fi

mv "$*" ~/Trash/

Das sollte funktionieren. Beachte, dass `[' nur ein Alias für test(1) ist (oder andersrum) und ich das nur der besseren Lesbarkeit halber verwendet hab.

whopper schrieb:
Bei mir gibt der Befehl "test -e irgendwas" wenn ich ihn direkt in der Bash eingebe weder was aus wenn die Datei existiert oder nicht.
Es kommt einfach wieder der Prompt. Ich bin ratlos

Das passt schon. Wichtig ist nur der Rückgabewert von test(1).

Code:
$ test -e foo
$ echo $?
1

Es gibt bei mir also keine Datei foo im aktuellen Verzeichnis.
 
whopper schrieb:
Code:
#!/bin/sh
                            
if /bin/test -e ~/Trash; then
/bin/mv $* ~/Trash
else
/bin/mkdir ~/Trash && /bin/mv $* ~/Trash
fi

So gehts komischerweise.
Das Test nichts ausgibt hab ich jetzt schon gemerkt.

Aber warum ist es ein unterschied ob ich

if /bin/test -e ~/Trash;

oder

if /bin/test -e "~/Trash";

mache?

Kann mir das einer erklären
 
Vielleicht weil ~/trash; nicht existiert, aber ~/trash ?

Falls das der Grund ist, noch ein Grund mehr [] zu benutzen. ;)

EDIT:

Davon abgesehen: Bei sh-Skripten besser immer quoten, auch wenns nicht unbedingt nötig ist. Auch besser ${var} als $var, optimal: "${var}". Ist sicherer und beugt Fehlern vor.
 
Zuletzt bearbeitet:
Das ist ja das Problem.

Mit quotes funkts ja nicht.

Also test -e "~/Trash" geht nicht.

Und das mit dem ; steht in irgendeiner Anleitung, also da steht

if Bedingung; then
Komandos
else
Komandos
fi
 
Ach so...

Sorry! ~ wird in den Quotes nicht durch den Pfad zum Homeverzeichnis ersetzt, sondern 'wörtlich' genommen. Ein Workaroud wäre z.B.:

"/home/${USER}/trash"
EDIT "$HOME/trash" Heute ist nicht mein Tag...

Das mit dem Semikolon stimmt schon. Man kann aber auch das then in die nächste Zeile schreiben. Ich machs auch auf einer Zeile.

Hätte wohl mal besser lesen müssen :rolleyes:
 
Zuletzt bearbeitet:
whopper schrieb:
Also test -e "~/Trash" geht nicht.
Natürlich nicht, solange es im aktuellen Verzeichnis kein Verzeichnis namens "~" gibt. Also mach die Anführungszeichen da weg.

whopper schrieb:
Und das mit dem ; steht in irgendeiner Anleitung, also da steht

if Bedingung; then
Und das ist 100% äquivalent zu:
Code:
if Bedingung
then
aspiring schrieb:
"/home/${USER}/trash"
Niemand garantiert, daß Heimatverzeichnisse unter /home liegen und das Verzeichnis dem Login-Namen entsprechen muß. Also richtig:
Code:
"$HOME"/Trash
aspiring schrieb:
Hätte wohl mal besser lesen müssen
Ja, das gilt aber auch für einige andere Leute hier, denn alle seit Post #12 aufgetretenen Fragen werden durch jedes UNIX-Grundlagen-Buch beantwortet.
 
0815Chaot schrieb:
Ja, das gilt aber auch für einige andere Leute hier, denn alle seit Post #12 aufgetretenen Fragen werden durch jedes UNIX-Grundlagen-Buch beantwortet.

Dann schreib ich halt nichts mehr ;'(

Aber hätten ja die anderen schon aufs UNIX-Grundlagen-Buch verweisen können :)
 
0815Chaot schrieb:
Ja, das gilt aber auch für einige andere Leute hier, denn alle seit Post #12 aufgetretenen Fragen werden durch jedes UNIX-Grundlagen-Buch beantwortet.

Na klasse,

und schon hat ein Newbie im Forum keine Lust mehr was zu schreiben oder sogar etwas konstruktives beizusteuern.
 
Mann, jetzt geht dieser Bullshit (ja, richtig gelesen!) wieder los. Ein Forum kann keine Grundlagen vermitteln. Und RTFM sollte wohl in diesem Umfeld nun wirklich nichts Neues sein. Leute, Leute. Gewisse Grundlagen müssen eben nun mal vorhanden sein, bevor man an einer Diskussion teilnehmen kann (und ein Forum besteht nun mal überwiegend aus Diskussionen).

Ich habe nichts dagegen, wenn mal jemand, wie aspriring schreibt, einen schlechten Tag erwischt. Das passiert jedem von uns. Wenn aber gleich das Geheule und Gemecker losgeht, weil auf Literatur verwiesen wird, und der Herr Hirnfick sogar den "Untergang des Boards" (übertrieben gesagt) prophezeit... :grumble:
 
Ich empfehle den Advanced Bash Scripting Guide. Ist zwar Bash, aber ziemlich umfangreich und gut gemacht.

http://www.tldp.org/LDP/abs/abs-guide.pdf


Was _mich_ angeht hat 0815_Chaot recht, hab mich halt mal blamiert. Peinlich, peinlich... Eigentlich weiß ich das ja...

Nur was die 'Anfänger' im Forum angeht; da hätte ein einziger Post am Anfang die Sache ja auch schon klären können... Mann sollte sein Wissen halt teilen. ;)
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben