Archiv verlassen und diese Seite im Standarddesign anzeigen : [bash] Elemente eines Verzeichnisses in einer Schleife
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ä
wenn ich Dich richtig verstehe suchst Du sowas wie
#!/bin/bash
for SERVER in /testfolder/*
do
things to $SERVER
done
hth
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
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
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
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
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.