Shell-Script zum auslesen von Dateien aus versch. Verzeichnissen

R

Redds

Grünschnabel
Hallo Leute,

ich habe ein Problem wo ich mit meinem Wissensstand einfach nicht weiterkomme:

Ich habe etwa 3000 verschiedene Verzeichnisse in /root/home/bla
diese sind immer 4-stellige Nummer, also z.b. 1234, 3333, 5656 (...)

in jedem Verzeichnis befinden sich .error und .archived Dateien welche so aufgebaut sind:

AE1234_1234__982356BATBAT_F0_164.pdf.edoc.error
oder
AE1234_1234__643256LALALA_F0_20090627_015301.TIF.edoc.20080627.135303.156.archived

-------------------------------------JAHR-MM-TT---HHMMSS (milli sek)
Wurde die Datei archiviert so ist 2009--06--27--. 16 33 09 .124. das Datum.

AE bleibt immer gleich und bekommt den VZ-Namen angehängt, 1234 ist der VZ-Name, 643256=Nummer BATBAT=Typ
In einem anderem VZ heißen die Dateien dann z.b.
AE5555_5555_234322XDKJQE(.....)

So, ich muss nun aus allen Verzeichnissen die Dateien, die mit .archived enden

1. auslesen
2. eine (z.b. eintraege.txt datei) in dem Verzeichnis erstellen und die eintrage geordnet auflisten z.b.

--AE------VZ-----Nummer---Typ-------Datum-------Uhrzeit
AE1234---1234---643256---LALALA---2009 06 27---16 33 09
AE1234---1234---123321---BLABLA---2010 03 12---12 21 19

(Rest kann weggelassen werden.)
Die "-" sind natürlich eigentlich Leerzeichen aber kann auch anders aufgebaut werden hauptsache es ist übersichtlicht :)

und 3. anschließend alle .archived Dateien aus dem Verzeichnis löschen.


Im Grunde also nur eine schönere Auflistung, wenn ich in root/home/bla/1234 "ll -a" eingebe erhalte ich etwa 150 dieser Dateien(oder Einträge) ich möchte nun das bei "ll -a" nur noch eintraege.txt angezeigt wird.

Öffnet man diese .txt Datei so sollen die 150 Einträge nach der obigen gliederung aufgelistet werden.

Ich hoffe ihr versteht was ich meine und könnt mir helfen.

Liebe Grüße,
Redds
 
Code:
#!/bin/bash

ls -ltr /root/home/bla > liste.txt

while read a 
do
ll -a  $ | awk {'print $9'} 

done <liste.txt

irgendwie so in der Richtung?
 
Zuletzt bearbeitet:
nein so richtig verstehe ich nicht, was du meinst. bla und laber ist eben nicht sehr konkret.

aber du könntest vielleicht find meinen

find /root/home/bla -t f -name *txt --exec <foo-beffehl> {};


ansonsten vielleicht nochmal deutlicher ;)
 
Hi,

und dann am besten noch System und Shell benennen, erklaeren wonach die Eintraege sortiert sein sollen, und wie die Verzeichnisstruktur verschachtelt ist (alles ein level tief?).

Ahja, und am besten nicht davon ausgehen, dass andere Leute die selben aliase wie du benutzen, ich meine ll ist haeufig ein alias auf 'ls -l', aber ich arbeite fast komplett ohne aliase, weiss es also nicht sicher. Ein Programm ll ist mir nicht bekannt.

mfg,
bytepool
 
Code:
#!/bin/bash

ls -ltr /root/home/bla > liste.txt

while read a 
do
ll -a  $ | awk {'print $9'} 

done <liste.txt

irgendwie so in der Richtung?

Hey, ja das sieht schon gar nicht schlecht aus.

Also nochmal kurz:

3000 Verzeichnisse in dem Verzeichnis: /root/home/bla
Die Verzeichnisse sind immer 4 stellige Ziffern wie 1234, 4444 ,5214 usw.
In jedem Verzeichniss sind 1-200 Einträge (wie oben beschrieben) die entweder mit .error oder mit .archived enden.

Nun gilt es, in jedem dieser 3000 Verzeichnisse ALLE .archived Einträge in eine liste in dem jeweiligen Verzeichnis zu schreiben und die .archived Einträge anschließend aus dem VZ löschen.

Hoffe ihr versteht das jetzt etwas besser.


Und sorry für das Doppelposting, dachte mehrere Ideen sind besser als eine..
 
Du suchst
Code:
man find
man echo
man basename
man dirname
man rm
 
Code:
find /root/home/bla *.archived >> liste.ini
rm /root/home/bla *.archived

Damit würde ich ja schonmal alle .txt dateien aus dem VZ bla in die liste.ini geschrieben bekommen. Nur er schreibt dann den ganzen Pfad in die ini...
 
Ich hoffe ich habe Deine Aufgabe richtig verstanden....

Versuche es mal damit....
Code:
[FONT="Courier New"]#!/bin/bash

echo "  AE      VZ     Nummer   Typ       Datum       Uhrzeit"

cd /root/home/bla/
find . -name "*archived" -exec ls -l --full-time {} \; | while read AKT_ZEILE; do

        FULLDATEINAME=`echo "$AKT_ZEILE" | cut -d" " -f10`
        VZ=`echo "$FULLDATEINAME" | cut -d"/" -f2`
        DATEINAME=`echo "$FULLDATEINAME" | cut -d"/" -f3`

        AE=`echo $DATEINAME | cut -b 1-6`
        NUMMER=`echo $DATEINAME | cut -b 14-19`
        TYP=`echo $DATEINAME | cut -b 20-25`

        DATUM=`echo "$AKT_ZEILE" | cut -d" " -f7 | tr "-" " "`
        UHRZEIT=`echo "$AKT_ZEILE" | cut -d" " -f8 | cut -d"." -f1 | tr ":" " "`


        echo "$AE   $VZ   $NUMMER   $TYP   $DATUM   $UHRZEIT"
done[/FONT]

ergibt folgende Ausgabe....
Code:
[FONT="Courier New"]HBtux:/tmp # ./test1.sh
  AE      VZ     Nummer   Typ       Datum       Uhrzeit
AE1234   1111   643256   LALALA   2010 04 13   22 04 39
AE5544   1155   643256   LALALA   2010 04 13   22 30 33
AE5544   1155   643256   BATBAT   2010 04 13   22 57 53
AE5544   1155   123456   TESTTT   2010 04 13   22 58 31[/FONT]
 
Hey HBtux,

super, vielen vielen Dank für deine Hilfe :)
Es läuft soweit, wenn ich noch eine Frage habe melde ich mich noch einmal.

Edit:

Ok, nun werden alle Einträge aus einem Ordner in eine .txt Datei geschrieben.
Nur wie schaffe ich es, dass das Script für JEDEN Ordner eine .txt Datei in genau diesem Ordner anlegt?


Also es sind ja 3000 Ordner, in jedem Ordner sind bis zu ~200 Einträge.

Ziel: nur noch 3000 Ordner, in jedem Ordner 0 Einträge (bzw die .error eintrg. sollen erhalten bleiben) und 1 .txt Datei in der die Auflistung der Einträge erfolgt [dies ist ja schon Fertig]
 
Zuletzt bearbeitet:
Einfach die echo-Ausgaben wie folgt in die Text-Dateien umleiten.....
(ich habe die Änderungen zu dem ersten Script fett Markiert.)
Code:
[FONT="Courier New"]#!/bin/bash

cd /root/home/bla/
find . -name "*archived" -exec ls -l --full-time {} \; | while read AKT_ZEILE; do

        FULLDATEINAME=`echo "$AKT_ZEILE" | cut -d" " [B]-f10-[/B]`
        VZ=`echo "$FULLDATEINAME" | cut -d"/" -f2`
        DATEINAME=`echo "$FULLDATEINAME" | cut -d"/" -f3`
        AE=`echo $DATEINAME | cut -b 1-6`
        NUMMER=`echo $DATEINAME | cut -b 14-19`
        TYP=`echo $DATEINAME | cut -b 20-25`
        DATUM=`echo "$AKT_ZEILE" | cut -d" " -f7 | tr "-" " "`
        UHRZEIT=`echo "$AKT_ZEILE" | cut -d" " -f8 | cut -d"." -f1 | tr ":" " "`

[B]        LOGFILE="$VZ/eintraege.txt"

        [ ! -f "$LOGFILE" ] && echo "  AE      VZ     Nummer   Typ       Datum       Uhrzeit" >> $LOGFILE[/B]

        echo "$AE   $VZ   $NUMMER   $TYP   $DATUM   $UHRZEIT"[B] >> $LOGFILE

        # hier kannst Du den Löschbefehl eintragen bzw. das echo vor dem Befehl entfernen....
        # Bitte vorher die Daten sichern bzw. den Befehl prüfen....!
        echo  rm -f "$FULLDATEINAME"
[/B]
done
[/FONT]

*** EDIT **** 21:21 Uhr *****************
Ich habe das Script noch mal etwas geändert....
Abfrage ob $LOGFILE bereits existiert - wenn Nein dann Header in Datei schreiben
*****************************
 
Zuletzt bearbeitet:
Hey HBtux,

danke danke danke nochmal!!
Es läuft jetzt wirklich, ich habe noch ein paar kleine Änderungen vorgenommen, da manche Einträge anscheinend auch anders aufgebaut waren (wusste ich vorher nicht).
Aber jetzt läufts :))
Echt Super, danke für die Hilfe und geopferte Zeit von dir.
 

Ähnliche Themen

sed im script per crontab

OpenSuse 11.1 USB Festplatte wird nicht erkannt

K3b bricht Audio-CD-brennen immer ab

Zurück
Oben