PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verzeichnissinhalte zentral sammeln...



Painkiller
11-06-2005, 17:38
Hallo...

Ich habe Fedora und hab ein Jahr lang systematisch einige Datenreihen total unuebersichtlich gesammelt:

Im Verzeichniss /backup/datenplots befinden sich weitere Unterverzeichnisse in denen sich weitere Verzeichnisse befinden koennen. Die Verzeichnisse haben auch meist verschiedene Namen wie "Viskositaet_040915" oder "ionenlauf_050418" Ausserdem existieren einige Verzeichnisse doppelt aber mit anderem inhalt, der jedoch gleiche Dateinamen hat.

Was ich nun braeuchte ist ein script welches von allen Dateien in den Verzeichnissen in einem anderen erstellten verzeichniss softlinks anlegt, und wenn ein verzeichniss doppelt bestehen sollte, muessen die softlinks numerisch durchnummeriert werden.


So, das hat keiner verstanden :D daher nochmal, es gibt das Verzeichniss mit unterverzeichnissen:

/backup/datenplots
/backup/datenplots/ionisierung/041210ionenlauf 20Dateien
/backup/datenplots/rotation/051105viskositaet 15Dateien
/backup/datenplots/rotation/041210ionenlauf 18Dateien

Wie ihr seht gibt es das Verzeichniss 041210ionenlauf zweimal.

nun soll ein script die daten in den verzeichnissen auslesen und softlinks anlegen:

/backup/softlinks/041210ionenlauf/041210ionenlauf_001.txt
/backup/softlinks/041210ionenlauf/041210ionenlauf_002.txt
/backup/softlinks/041210ionenlauf/041210ionenlauf_003.txt
.
.
.
/backup/softlinks/041210ionenlauf/041210ionenlauf_038.txt
/backup/softlinks/051105viskositaet/051105viskositaet_001.txt
.
.
/backup/softlinks/051105viskositaet/051105viskositaet_015.txt


Ihr seht das die Daten aus 041210ionenlauf alle in einem gemeinsamen verzeichniss gelandet sind und alle sauber durchnummeriert sind, entsprechent ihres Herkunftsverzeichnisses.


Ich hoffe ich konnte mich einigermassen ausdruecken. Das sind ca. 800 Verzeichnisse und unterverzeichnisse mit ca. 15.000 Dateien. Das waere Toedlich es manuell zu versuchen. da schleichen sich spaetestens nach 10 Verzeichnissen routinefehler ein.

:)

peschmae
11-06-2005, 18:36
Hmm, und jetzt? Im AGB dieses Forums steht nur was von Programmierforum und nix von "doWhatIWant-Funktion-Implementierer..." ;)

MfG Peschmä

Painkiller
11-06-2005, 18:52
Naja... diese Funktion muss ja auch Programmiert werden.

Ich weiss aber was du meinst, das einzige was ich selber kann ist per cp sachen von a nach b verschieben und so kleinkram. Beim Rest braeuchte ich hilfe :(

peschmae
11-06-2005, 19:57
Eigentlich nicht soo ne Sache, sollte mit find zu erschlagen sein vermute ich.

Kann es da Dateinamenkollisionen gehen und sollte man damit irgendwie umgehen?
Also das in zwei 041210ionenlauf-Verzeichnissen Dateien gleichen Namens sind? Oder soll das Script die selber einfach durchnumerieren ungeachtet dessen ob es eine Datei mehrmals gibt?

MfG Peschmä

Painkiller
12-06-2005, 18:40
Hallo...

Es kann in den zwei "041210ionenlauf" verzeichnissen durchaus auch gleiche Dateinamen geben. Die haben allerdings andere Inhalte, daher sollten alle Dateien erhalten bleiben und nur simpel hintereinander durchnummeriert in ein gemeinsames "041210ionenlauf" Verzeichniss gelinkt werden. :)

peschmae
12-06-2005, 21:09
Mal sowas fürn Anfang - weiss aber nicht obs 100%ig hinhaut so wie dus möchtest aber es scheint was in die Richtung zu tun:



IFS="
"

LINKDIR=/tmp/links
FILEDIR=/home/peschmae/test

cd $FILEDIR

find -type f | while read f; do
LB=$(echo $(dirname $f) | sed "s#.*/##")

for LN in $(seq -w 1 999); do
if [ ! -h $LINKDIR/$LB/${LB}_${LN}.txt ] ; then
break
fi
done

mkdirhier $LINKDIR/$LB
ln -s $f $LINKDIR/$LB/${LB}_${LN}.txt
done


MfG Peschmä

Painkiller
13-06-2005, 08:44
Danke... Ich werde es mal testen.

Painkiller
13-06-2005, 19:49
Hallo...

Ich habe das script getestet und mir ist aufgefallen, das die Softlinks alle falschgelegt werden. Sie beziehen sich auf eine relative Position der Links zu den Quelldaten. So verweisst der Link von "/backup/test/test1/ionentest004/041210ionenlauf.txt" im verzeichniss "/tmp/link" nach "/test./test1/ionentest004/041210ionenlauf.txt"

Ich habe das Script ein wenig umgebogen:


rm -r /tmp/links/*
rm /backup/test.

IFS="
"

LINKDIR=/tmp/links
FILEDIR=/backup/test/

cd $FILEDIR

find -type f | while read f; do
LB=$(echo $(dirname $f) | sed "s#.*/##")

for LN in $(seq -w 1 999); do
if [ ! -h $LINKDIR/$LB/${LB}_${LN}.txt ] ; then
break
fi
done

mkdirhier $LINKDIR/$LB
ln -s $FILEDIR$f $LINKDIR/$LB/${LB}_${LN}.txt
done

ln -s /backup/test /backup/test.

Da ich oefters getestet habe, hab ich zuerst alte links weg und das Verzeichniss /backup/test. geloescht. Sonst alles wie gehabt bis hier:

ln -s $FILEDIR$f $LINKDIR/$LB/${LB}_${LN}.txt

Vor der eingabevariable $f ist noch das Filedir vorgehaengt, dadurch wird die Quelldatei nicht bei "/test./test1/ionentest004/041210ionenlauf.txt" gesucht sondern in "/backup/test./test1/ionentest004/041210ionenlauf.txt" . Durch

ln -s /backup/test /backup/test.

erzeuge ich dann noch einen link /backup/test. So werden die Quelldateien auch gefunden.

Soweit funktioniert das script wunderbar. Ich hab damit vorhin in ca. 11min 16.200 Dateien mit Softlinks versehen. Das mit den Verzeichnissen und numerische Folge funktioniert wunderbar.

Das einzige was stoert ist der letzte Softlink um /backup/test. zu erzeugen. Das macht das ganze etwas "unsauber".


Aber endlich blicke ich bei den Daten mal wieder durch :) Danke dir bisher :D

peschmae
13-06-2005, 20:04
Ich verstehe die
ln -s /backup/test /backup/test.
Geschichte nicht ganz.

Ausserdem würde ich wenn ich dich wäre LINKDIR anderswo hinsetzen als auf /tmp - bei mir zumindest (und auch auf den anderen Linuxen d ie ich kenne) wird das nämlich bei jedem Booten geleert :D

MfG Peschmä

Painkiller
13-06-2005, 20:32
Das ist ja auch nur ein test. Natuerlich liegen die Links jetzt nicht in /tmp :D

Zu dem ln:

Das script legt so wie es von dir kommt, einen Verzeiss vom Link nach:

/test./test1/ionentest004/041210ionenlauf.txt

Weil die Quelldatei aber in

/backup/test/test1/ionentest004/041210ionenlauf.txt

liegt, habe ich

ln -s $FILEDIR$f $LINKDIR/$LB/${LB}_${LN}.txt

so abgeaendert. Jetzt weisst der link nach:

"/backup/test./test1/ionentest004/041210ionenlauf.txt

Also immer ein Punkt am Ende des FILEDIR. Aber weil ich kein "/backup/test." habe, sondern nur "/backup/test" habe lege ich einen weiteren Link:

ln -s /backup/test /backup/test.

gelegt. So wird das Problem ueberbrueckt.

Noch fragen? :)

peschmae
13-06-2005, 20:47
Wenn du statt in den Ordner zu wechseln mit
cd $FILEDIR

nachher beim Find den Ordner angibst:
find $FILEDIR -type f

dann ist im Output von find jeweils der absolute Pfad drin und die Sache sollte kein Problem mehr sein.

MfG Peschmä

Painkiller
14-06-2005, 12:53
Hallo...

Es funktioniert einwandfrei. Dankeschoen :D