• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Dateien mit ungeraden Zahlen in Unterverzeichnis verschieben

dlx76

Newbie
Hallo Zusammen,

ich bräuchte mal wieder eure Hilfe.

Heute ist die Aufgabestellung etwas komplizierter asl gestern:

Ich habe einen Ordner mit folgenden Dateien ->

001_LVS_GREVEN_09092008150015.dat 012_LVS_GREVEN_09092008150015.dat
002_LVS_GREVEN_09092008150015.dat 013_LVS_GREVEN_09092008150015.dat
003_LVS_GREVEN_09092008150015.dat 014_LVS_GREVEN_09092008150015.dat
004_LVS_GREVEN_09092008150015.dat 015_LVS_GREVEN_09092008150015.dat
005_LVS_GREVEN_09092008150015.dat 016_LVS_GREVEN_09092008150015.dat
006_LVS_GREVEN_09092008150015.dat 017_LVS_GREVEN_09092008150015.dat
007_LVS_GREVEN_09092008150015.dat 018_LVS_GREVEN_09092008150015.dat
008_LVS_GREVEN_09092008150015.dat 019_LVS_GREVEN_09092008150015.dat
009_LVS_GREVEN_09092008150015.dat 020_LVS_GREVEN_09092008150015.dat
010_LVS_GREVEN_09092008150015.dat archive
011_LVS_GREVEN_09092008150015.dat

Es soll für jede Datei mit ungerader Nummer (am Anfang) ein Unterverzeichnis angelegt werden. Das Verzeichnis soll den Namen der Dateinummer tragen (z.B. für 002 soll das Verzeichnis dann „zwei“ heißen, für 014 dann „vierzehn“). Das ganze soll mit einer for-Schleife gelöst werden.

Danke ;)
 
Kannst Du deine Hausaufgaben bitte selber machen? Nichts gegen Nachhilfe aber das sieht mir nicht nach Hilfe zur Selbsthilfe aus sondern nach: Ich hab da ein paar doofe gefunden die meinen Mist machen. Sorry, dafür sind weder die Hausaufgaben noch das Forum gedacht.
 
OP
D

dlx76

Newbie
Sorry ich hab einfach fast keine Erfahrung mit Shell-Scripting.
Die Auswertung welche Datei ein gerade oder ungerade Zahl hat bekomm ich noch hin das Problem ist die Benennung der Unterverzeichnise.
 
A

Anonymous

Gast
dlx76 schrieb:
Es soll für jede Datei mit ungerader Nummer (am Anfang) ein Unterverzeichnis angelegt werden. Das Verzeichnis soll den Namen der Dateinummer tragen (z.B. für 002 soll das Verzeichnis dann „zwei“ heißen, für 014 dann „vierzehn“). Das ganze soll mit einer for-Schleife gelöst werden.

Diese Aufgabe kann die Shell nicht lösen, da für die Shell 002 ( ob nun oktal oder dezimal interpretiert, ist egal) immer gerade ist, das selbe mit 014.

Warum willst du immer alles mit der for-Schleife lösen? while währe hier ehr angesagt.
ansonsten mal den Arithmetischen Operator "%" anschauen http://linux.die.net/man/1/bash funktioniert wie in der Matematik und in jeder Programmiersprache
Sowie mal nach "case" suchen, eventuell findest du auch switch . http://ss64.com/bash/
Den Rest "mkdir" , "mv" sollte ja nicht das Problem darstellen.


robi
 

abgdf

Guru
Für Dein Problem ist Perl eine gute Wahl.

Lies Dir mal meine Seite zu Perl durch, und poste dann mal einen Codevorschlag.

Mach' dabei erstmal nichts mit "Verzeichnisse erstellen" oder "Dateien bewegen", sondern poste nur was mit "print" zur reinen Datenverarbeitung.

Wenn Du bereit bist, das zu tun, und nur dann, helfe ich Dir - vielleicht - bei den restlichen Feinarbeiten.

Gruß
 

panamajo

Guru
robi schrieb:
Diese Aufgabe kann die Shell nicht lösen, da für die Shell 002 ( ob nun oktal oder dezimal interpretiert, ist egal) immer gerade ist, das selbe mit 014.
Wieso, bash kann doch Bit-Arithmetik?
Code:
$ num="005"; echo $(( num & 1 ))
1
$ num="004"; echo $(( num & 1 ))
0
 

Faxxon

Member
... und beim Gerade-Ungerade-Vergleich ist auch nur die letzte Ziffer wichtig.
In der Aufgabe oben kann Man also was mit:
Code:
if test $[ ${DATEINAME:2:1} % 2 ] = 1 ; then
...
fi
hinbiegen.
 

Faxxon

Member
Ach ja, die Bash lässt sich zwingen, eine Zahl auch mit führenden Nullen als Dezimalzahl zu interpretieren:
Code:
OhneNullen=$[ 10#$MitNullen ]
 
A

Anonymous

Gast
panamajo schrieb:
robi schrieb:
Diese Aufgabe kann die Shell nicht lösen, da für die Shell 002 ( ob nun oktal oder dezimal interpretiert, ist egal) immer gerade ist, das selbe mit 014.
Wieso, bash kann doch Bit-Arithmetik?

kann sie freilich, aber sie kann nicht eine 2 oder eine 14 als ungerade anschauen. Aufgabe war doch wenn ich nicht irre:
Es soll für jede Datei mit ungerader Nummer (am Anfang) ein Unterverzeichnis angelegt werden. Das Verzeichnis soll den Namen der Dateinummer tragen (z.B. für 002 soll das Verzeichnis dann „zwei“ heißen, für 014 dann „vierzehn“)

Das meinte ich mich das die Shell das nicht kann. ;)

was ich überhaupt nicht verstehe warum ihr diese Aufgabe so verkomplizieren wollt. Warum wollt ihr ihr unbedingt den Namen auseinandernehmen erst noch prüfen ob irgendwas durch 2 Teilbar ist , wenn doch sowieso hinterher noch eine Einzel-Umwandlung zu etwas ganz Anderem erfolgen muss.

Code:
for i in 0*
do
  case "$i" in
   001*) echo "eins"  ;;
   003*) echo "drei"  ;;
   005*) echo "fuenf"  ;;
   .......
  esac
 done
natürlich in dem Fall nicht echo sondern mkdir und mv.
Code:
for i in 00*
 do
  DIR=""
    case "$i" in
       001*) DIR="eins" ;;
       003*) DIR="drei" ;;
       005*) DIR="fuenf" ;;
       .......
    esac
   if [ $DIR ]
      then
        mkdir -p "$DIR"
        cp "$i" "$DIR"
   fi
 done
Jetzt nur noch cp durch mv austauschen und schon sind die Hausaufgaben fertig für heute.



robi
 

abgdf

Guru
Code:
#!/usr/bin/perl

my @a = qw(001_LVS_GREVEN_09092008150015.dat 012_LVS_GREVEN_09092008150015.dat
002_LVS_GREVEN_09092008150015.dat 013_LVS_GREVEN_09092008150015.dat
003_LVS_GREVEN_09092008150015.dat 014_LVS_GREVEN_09092008150015.dat
004_LVS_GREVEN_09092008150015.dat 015_LVS_GREVEN_09092008150015.dat
005_LVS_GREVEN_09092008150015.dat 016_LVS_GREVEN_09092008150015.dat
006_LVS_GREVEN_09092008150015.dat 017_LVS_GREVEN_09092008150015.dat
007_LVS_GREVEN_09092008150015.dat 018_LVS_GREVEN_09092008150015.dat
008_LVS_GREVEN_09092008150015.dat 019_LVS_GREVEN_09092008150015.dat
009_LVS_GREVEN_09092008150015.dat 020_LVS_GREVEN_09092008150015.dat
010_LVS_GREVEN_09092008150015.dat 011_LVS_GREVEN_09092008150015.dat);

my %h = (1 => "eins",
         2 => "zwei",
         9 => "neun");

foreach (@a) {
    my @b = split("_", $_);
    my $c = $b[0] + 1 - 1;
    if ($c % 2) {
        print "Ungerade: $c\n";
    } else {
        print "Gerade: $c\n";
    }
    if (exists $h{$c})  {
        print "$c\t$h{$c}\n";
    }
}
Konnt's nicht lassen. Den Hash "%h" weiter auffüllen, muß er aber selber.
 
Oben