[linux-l] gelöschte Dateien wiederherstellen

Steffen Schulz pepeatgoofy at gmx.net
Fr Feb 28 21:13:46 CET 2003


On 030228 at 17:51, Oswald Buddenhagen wrote:
> On Fri, Feb 28, 2003 at 05:19:27PM +0100, Steffen Schulz wrote:
> > Kennt wer ein gutes hexdump-tool, welches im Idealfall noch
> > weitestgehend scriptgesteuert funktioniert?
> >
> dd *g*

Du hast vollkommen recht. Lang lebe die shell und das Baukastenprinzip.

-----------------------------------------------------------------------
#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin

bs=4096 # blocksize
delta=4092 # threshold (wenn danach alles Nullen -> neue datei)

test -n $1 || { echo "Usage: $0 imagefile nonexistant_destination_directory" && exit; }
test -n $2 || { echo "Usage: $0 imagefile nonexistant_destination_directory" && exit; }
mkdir $2   || { echo "Usage: $0 imagefile nonexistant_destination_directory" && exit; }

image=$1
dest=$2
temp=$(tempfile)

# calc number of blocks in $image
blocks=$(echo $(du -b $image|awk '{print $1}' )/$bs|bc)

for i in $(seq 0 $blocks); do {
	test -n "$(dd if=$image bs=$bs count=1 skip=$i 2>/dev/null)" || continue
	dir=$(dd if=$image bs=$bs count=1 skip=$i  2>/dev/null |file -b -)
	dir=$dest/$(echo $dir|awk '{print $2}')/$(echo $dir|awk '{print $1}')
	test -d $dir || mkdir -p $dir
	file=$dir/file$i.raw
	dd if=$image bs=$bs count=1 skip=$i 2>/dev/null > $file
	end=$(dd if=$file count=$bs skip=$delta bs=1 2> /dev/null)
	while test -n "$end"; do {
		i=$(echo "$i+1"|bc)
		dd if=$image bs=$bs count=1 skip=$i 2>/dev/null > $temp
		end=$(dd if=$temp count=5 skip=$delta bs=1 2> /dev/null)
		cat $temp >> $file
	}; done
		

}; done
----------------------------------------------------------------------

Läuft gerade. Läuft langsam. Macht Fehler. Aber's läuft.
Interessanter Weise scheint noch irgendwo nen fehler zu sein, nachdem
eine grosse datei zusammengesetzt ist und aus der while-schleife
ausgebrochen wird, fängt er die selbe Datei nochmal an und baut für ein
grösseres $i die selbe Datei nochmal zusammen. Ich vermute das liegt
daran, dass ich $i nur innerhalb der while-schleife hochzähle, dies die
for-schleife aber ignoriert? Hab eben nen export vor die i-inkrementierung
gesetzt, werd mal sehen, ob das geht...wenn jemand Fehler findet,
immer her damit.

> ich persönlich würde etwas in perl zusammenscripten ...

ich kann kein perl, aber tu dir keinen Zwang an :)

> wette darauf mal nicht (das ist ein zeilenende und nicht alle
> textdateien haben das am ende). worauf du dich (glaub ich) verlassen
> kannst ist, daß hinter den daten der rest des sektors genullt ist. pech
> hast du nur, wenn eine datei gerade mit einem sektor endet.

Das ist nen Problem, sollte aber eher bei wenigen Dateien auftreten.
Können die Nullen, nach denen ich suche, auch innerhalb von Dateien
auftreten?

mfg
pepe



Mehr Informationen über die Mailingliste linux-l