Ordnernamen auslesen Shell

DevilofCrash007

New Member
Hallo liebe Community,

ich bin nun mehr seid gut 1 1/2 std damit beschäftigt, eine Lösung zu finden zu meinem Problem.

Na dann mal los...

Ich möchte gerne per Shell, die ordnernamen aus einem ordner auslesen.

ich habe dahingegen ja schon mehrere ansätze gehabt, aber nur komme ich da nicht weiter oder es erfolgt ein falsches ergebniss :(

ich habe durch einer anderen seite etwas mit dem programm TREE gelesen und auch ausprobiert. Local versteht sich von allein...

nun habe ich über tree dann den befehl "tree -d -f -i /ordner/pfad/" angegeben und da hat er mir auch eine ausgabe herrausgegeben von

/ordner/pfad/1
/ordner/pfad/2
/ordner/pfad/3

aber ich hätte es eigendlich ohne der Pfad angabe "/ordner/pfad/" sodass nur die namen der ordner da stehen.

wie kann ich dies bewerkstelligen?
 
Find ist mächtiger:
Code:
find /home/server/ -maxdepth 1 -type d -printf '%P\n'

%P schneidet Suchpfad vom Treffer ab. In diesem Beispiel wird aus dem String /home/server/ entfernt.

Wenn du den Output verarbeiten willst und z.B. Leerzeichen in Verzeichnisnamen (bitte benutze nicht das Wort Ordner) verarbeiten willst, gibt es mehrere Ansätze. Den Ansatz mit IFS werde ich nicht erläutern, da es ein übler Hack ist.

Mit while read (liest ganze Zeilen ein):

Code:
find /home/server/ -maxdepth 1 -type d -printf '%P\n' | while read file; do
    foo $file
    bar $file
    baz
done

Die Andere Möglichkeit ist es xargs in Verbindung mit dem Nullbyte-Seperator zu verwenden, was vieles eleganter aussehen lässt, als die Lösung mit read:

Code:
find /home/server/ -maxdepth 1 -type d -printf '%P\0' | xargs -0 foo
find /home/server/ -maxdepth 1 -type d -printf '%P\0' | xargs -0 -I'{}' bar {} dest
#oder in eine Datei umleiten:
find /home/server/ -maxdepth 1 -type d -printf '%P\0' > match_dir.txt.0
xargs -a match_dir.txt.0 -0 foo
xargs -a match_dir.txt.0 -0 -I '{}' bar {} dest

Xargs setzt alle Treffer ein, sofern man es nicht -n "max-args" steuert. Befehle wie cp, mv usw. unterstützen mehr als ein Argument als Quelle. Da xargs unter anderem die Argumente dem Befehl direkt übergibt anstatt den Umweg über die Shell zu gehen, machen Sonderzeichen und Leerzeichen keine Probleme und müssen auch nicht Escaped werden.

Du solltest dir auf jeden Fall die Verwendungsweise von find und xargs genauer ansehen. Wenn du das blind beherrscht, wird dir das viel Zeit sparen.
 
Gibt da verschiedene Wege für.

Zum Beispiel wäre da noch:
Code:
cd /ordner/pfad/; ls -d *
was aber unpraktisch ist, oder:
Code:
ls -d /ordner/pfad/* | xargs -n1 basename
 
Gibt da verschiedene Wege für.

Zum Beispiel wäre da noch:
Code:
cd /ordner/pfad/; ls -d *
Den Code sieht man bei Anfängern sehr oft.
Mal angenommen der Pfad existiert nicht, dann listet ls die Verzeichnisse im Pfad auf, in dem sich der User zuvor befand als das Script gestartet worden ist.


was aber unpraktisch ist, oder:
Code:
ls -d /ordner/pfad/* | xargs -n1 basename
Schon besser. Wenn der Pfad nicht existiert wird das in stderr ausgegeben und über stdout nichts. Somit macht xargs auch nichts. Versteckte Verzeichnisse werden durch das Globbing nicht ausgegeben. Da fangen dann die Probleme an, wenn die User nach .* suchen und ls dann auch die realtiven Pfade . und .. ausgibt.
 
Last edited by a moderator:
Mal angenommen der Pfad existiert nicht, dann listet ls die Verzeichnisse im Pfad auf, in dem sich der User zuvor befand als das Script gestartet worden ist.
Dann eben
Code:
cd /ordner/pfad/ && ls -d *
 
Back
Top