Re: Dateien per Bash-Script sortieren

From: Christoph Sandhaus <stift@draupadi.de>
Date: Fri May 26 2006 - 13:50:44 CEST

Am Freitag, 26. Mai 2006 13:16 schrieb lists@andreas-thomsen.de:
> Hi!
>
> Ich möchte 34000 Dateien sortieren. Das mach man wohl mit einem Script. :-)
>
> Die Dateinamen haben folgenden Aufbau:
>
> KUNDE.TTMMJJJJ.SSMMss und optional: noch ein .Z
> und liegen in einem Verzeichnis in oder out.
>
> Die Länge von KUNDE ist leider variabel, und die Zahl Z am Ende kommt nur,
> wenn Dateien mit gleichem Zeitstempel existieren.
>
> Ziel ist:
>
> .../kunde/in/JJJJ/MM/TT/KUNDE.TTMMJJJJ.SSMMSS[.Z]

Ist "KUNDE.TTMMJJJJ.SSMMSS[.Z]" ein Verzeichnis oder der Dateiname?

>
> Ich habe mit mmv experimentiert, das legt aber keine Verzeichnisse an.
>
> So sah das aus:
> mcp "in/*.????????.??????*"
> "#1/in/#6#7#8#9/#4#5/#2#3/#1.#2#3#4#5#6#7#8#9.#10#11#12#13#14#15#16"
>
> Wie kriege ich die Infos aus dem unterschiedlich langen Dateinamen? Und

Zum Splitten hast du mehrere Möglichkeiten (siehe jeweils man-page):
1) cut
  mit cut kannst du via delimmitter '-d' festlegen, welches Zeichen der
Trenner ist und mit -f, welche(s) Feld(er) du haben möchtest.

: set $(echo "eins.zwei.drei" | cut -f1 -d".")
: echo $1
eins
: set $(echo "eins.zwei.drei" | cut -f2 -d".")
: echo $1
zwei
: echo "eins.zwei.drei" | cut -f1 -d"."
eins
: echo "eins.zwei.drei" | cut -f2 -d"."
zwei

2) awk
mit "-F" teilst du awk mit, was der "Field Delimitter" ist. Also der Punkt
der Bereich '{...}' teilt akw mit, was ausgegeben werden soll. Die single
Quotes gehören dazu.
Die doppelten Anführungsstriche sind notwendig, wenn du festen Text mit
einbauen möchtest, hier jeweils ein Leerzeichen.
In Kombination mit "set" werden die einzelnen Felder dann den
Umgebungsvariablen $1, $2, ... zugewiesen. Gugst du hier:

: set $(echo "eins.zwei.drei" | awk -F '.' '{print $1" "$2" "$3}')
: echo $1
eins
: echo $2
zwei
: echo $3
drei
: NEUER_TEXT="Zuerst ist da die $1, dann die $2 und dann die $3"
: echo $NEUER_TEXT
Zuerst ist da die eins, dann die zwei und dann die drei

> wie lege ich die Verzeicnisse an?

mkdir -p "verzeichnisname". Mit '-p' wird die Verzeichnistiefe rekursiv
angelegt.

Folgendes Beispielscript ist jetzt ungetestet, weil hier in der Mail
getippert. Können natürlich 1000 Sachen verbessert werden:
- Temporäre Datei TempDirList wieder löschen, resp. exclusiver Zugriff
- Verzeichnisse/Dateien jeweils prüfen (Existenz, lesen, schreiben, ...)
- ...

#!/bin/sh

find "/tmp/meine34000Dateien" -type f > /tmp/TempDirList

while read ABS_FILENAME
do
        BASE_FNAME=$(basename $ABS_FILENAME)
        set $(echo $BASE_FNAME | awk -F '.' '{print $1" "$2" "$3" "$4})
        KUNDE="$1"
        TT=$(echo "$2" | cut -c1-2)
        MM=$(echo "$2" | cut -c3-4)
        JJ=$(echo "$2" | cut -c5-8)

        DST_DIR="/tmp/output/$KUNDE/in/$JJ/$MM/$TT/"
        mkdir -pf "$DST_DIR"

        cp "$ABS_FILENAME" "$DST_DIR"
done < /tmp/TempDirList

> Ist doch bestimmt ein Standardproblem und schon tausend mal gelöst...

Ja, und zwar immer wieder individuell ... :D

Laßt mal hören/lesen, obs geholfen hat.

Gruß,
Christoph
Received on Fri, 26 May 2006 13:50:44 +0200

This archive was generated by hypermail 2.1.8 : Fri May 26 2006 - 13:50:48 CEST