PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [bash] Elemente eines Verzeichnisses in einer Schleife



aggy
20-04-2007, 09:46
Hallo Zusammen,

ich suche nach einer Möglichkeit jedes Element eines Verzeichnisses einzeln in einer Schleife zu verwenden.

Das Funktionierte bisher immer (von Hand gepflegte Liste):


#!/bin/bash
cat /tmp/test.test | while read SERVER; do
<hier mache ich dann was mit dem $SERVER>
done

Nun möchte ich aber die Liste nicht aus einer Datei sondern direkt aus dem Verzeichnis. Meine Versuche waren bisher erfolglos:


#!/bin/bash
ls -1 /testfolder | while read SERVER; do
<hier mache ich dann was mit dem $SERVER>
done

Hat jemand eine idee ?

peschmae
20-04-2007, 14:17
Das funktioniert durchaus, so wie du das machst. Nur nicht vergessen dass das was in $SERVER ist der Dateiname ist und nicht der Pfad - verwenden musst du also /testfolder/$SERVER.

Alternativ kannst du auch find verwenden:

find /tmp/ -maxdepth 1 -exec echo {} \;

{} entspricht $SERVER
\; entspricht done (nicht vergessen! ;))

MfG Peschmä

newton
20-04-2007, 14:21
wenn ich Dich richtig verstehe suchst Du sowas wie


#!/bin/bash
for SERVER in /testfolder/*
do
things to $SERVER
done

hth

aggy
23-04-2007, 15:47
Vielen Dank erstmal für die Antworten.

@peschmae: Ich möchte ja auch eigentlich nur den Dateinamen, den Pfad hänge ich an den bestimmten Stellen im Skript ebend wieder an. Mit der Liste hat es ja bisher funktioniert, da standen auch nur Servernamen drin.

@newton: Dein Tip funktioniert soweit. Jetzt hab ich zwar den kompletten Pfad drin, aber der lässt sich mit cut ja leicht entfernen.


#!/bin/bash
for SERVER in /bla/blubb/*; do
SERVER=`echo $SERVER | cut -d/ -f4`
done

newton
23-04-2007, 16:30
oder ohne cut:

#!/bin/bash
cd /bla/blubb
for SERVER in *; do
foo $SERVER
done

also erst in das gewuenschte Verzeichnis wechseln.

ThorstenS
24-04-2007, 14:09
Zum Aufsplitten gibts noch das:


$ var=/home/user/test.iso
$ basename $var
test.iso
$ dirname $var
/home/user

jan61
09-05-2007, 23:43
Vielen Dank erstmal für die Antworten.

@peschmae: Ich möchte ja auch eigentlich nur den Dateinamen, den Pfad hänge ich an den bestimmten Stellen im Skript ebend wieder an. Mit der Liste hat es ja bisher funktioniert, da standen auch nur Servernamen drin.

@newton: Dein Tip funktioniert soweit. Jetzt hab ich zwar den kompletten Pfad drin, aber der lässt sich mit cut ja leicht entfernen.


#!/bin/bash
for SERVER in /bla/blubb/*; do
SERVER=`echo $SERVER | cut -d/ -f4`
done

Der cut läuft natürlich nur dann, wenn die Verzeichnistiefe stimmt und konstant bleibt. Nimm stattdessen basename:

SERVER="`basename \"$SERVER\"`"

Ich weise mit dem Schnipsel gleich noch auf ein 2. Problem hin: das geht alles schief, wenn Leerzeichen in den Pfaden drin sind. Besser immer quoten - und statt einer for-Schleife while - read benutzen. In der for-Schleife werden aus einem Pfad mit Leerzeichen mehrere Argumente.

Jan

jan61
09-05-2007, 23:48
Das funktioniert durchaus, so wie du das machst. Nur nicht vergessen dass das was in $SERVER ist der Dateiname ist und nicht der Pfad - verwenden musst du also /testfolder/$SERVER.

Alternativ kannst du auch find verwenden:

find /tmp/ -maxdepth 1 -exec echo {} \;

{} entspricht $SERVER
\; entspricht done (nicht vergessen! ;))

MfG Peschmä

Urgs ;)
Da wird für jeden Pfad ein echo aufgerufen. Dafür gibts print:

find /tmp -maxdepth 1 -print

Wenn man ein Kommando ausführen will:

find /tmp -maxdepth 1 -print | xargs Kommando

Jan