Anzeige:
Ergebnis 1 bis 8 von 8

Thema: [bash] Elemente eines Verzeichnisses in einer Schleife

  1. #1
    aggy
    Gast

    [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):
    Code:
    #!/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:
    Code:
    #!/bin/bash
    ls -1 /testfolder | while read SERVER; do
    <hier mache ich dann was mit dem $SERVER>
    done
    Hat jemand eine idee ?

  2. #2
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    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:
    Code:
    find /tmp/ -maxdepth 1 -exec echo {} \;
    {} entspricht $SERVER
    \; entspricht done (nicht vergessen! )

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  3. #3
    Registrierter Benutzer
    Registriert seit
    29.07.2004
    Ort
    Berlin
    Beiträge
    40
    wenn ich Dich richtig verstehe suchst Du sowas wie
    Code:
    #!/bin/bash
    for SERVER in /testfolder/*
    do
      things to $SERVER
    done
    hth

  4. #4
    aggy
    Gast
    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.

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

  5. #5
    Registrierter Benutzer
    Registriert seit
    29.07.2004
    Ort
    Berlin
    Beiträge
    40
    oder ohne cut:
    Code:
    #!/bin/bash
    cd /bla/blubb
    for SERVER in *; do
      foo $SERVER 
    done
    also erst in das gewuenschte Verzeichnis wechseln.

  6. #6
    Registrierter Benutzer
    Registriert seit
    17.07.2003
    Beiträge
    87
    Zum Aufsplitten gibts noch das:

    PHP-Code:
    $ var=/home/user/test.iso
    basename $var
    test
    .iso
    dirname $var
    /home/user 

  7. #7
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Zitat Zitat von aggy Beitrag anzeigen
    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.

    Code:
    #!/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:
    Code:
    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

  8. #8
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Zitat Zitat von peschmae Beitrag anzeigen
    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:
    Code:
    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:
    Code:
    find /tmp -maxdepth 1 -print
    Wenn man ein Kommando ausführen will:
    Code:
    find /tmp -maxdepth 1 -print | xargs Kommando
    Jan

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •