Vier (mehr) verlässliche Optionen.
Eine nicht börsennotiert Sternchen *
wird von der Shell als Muster (glob) interpretiert. Die Shell verwendet es bei der Expansion von Pfadnamen. Sie erzeugt dann eine Liste von Dateinamen, die mit dem Muster übereinstimmen.
Ein einfaches Sternchen passt zu allen Dateinamen im PWD (aktuelles Arbeitsverzeichnis). Ein komplexeres Muster wie */
findet alle Dateinamen, die auf /
. Also alle Verzeichnisse. Deshalb ist der Befehl:
1.- Echo.
echo */
echo ./*/ ### Avoid misinterpreting filenames like "-e dir"
wird (von der Shell) erweitert zu echo
alle Verzeichnisse in der PWD.
Um dies zu testen: Erstellen Sie ein Verzeichnis ( mkdir
), die wie test-dir benannt sind, und cd
in sie hinein:
mkdir test-dir; cd test-dir
Erstellen Sie einige Verzeichnisse:
mkdir {cs,files,masters,draft,static} # Safe directories.
mkdir {*,-,--,-v\ var,-h,-n,dir\ with\ spaces} # Some a bit less secure.
touch -- 'file with spaces' '-a' '-l' 'filename' # And some files:
Der Befehl echo ./*/
bleibt auch bei Dateien mit ungeraden Namen zuverlässig:
./--/ ./-/ ./*/ ./cs/ ./dir with spaces/ ./draft/ ./files/ ./-h/
./masters/ ./-n/ ./static/ ./-v var/
Aber die Leerzeichen in den Dateinamen machen das Lesen etwas verwirrend.
Wenn anstelle von echo
verwenden wir ls
. Die Shell ist nach wie vor derjenige, der die Liste der Dateinamen erweitert. Die Shell ist der Grund dafür, eine Liste von Verzeichnissen im PWD zu erhalten. Die -d
Option zu ls
bewirkt, dass der aktuelle Verzeichniseintrag anstelle des Inhalts jedes Verzeichnisses aufgelistet wird (wie es standardmäßig der Fall ist).
ls -d */
Dieser Befehl ist jedoch (etwas) weniger zuverlässig. Er schlägt bei den oben aufgeführten Dateien mit ungeraden Namen fehl. Bei mehreren Namen bleibt er stecken. Sie müssen eine nach der anderen löschen, bis Sie die problematischen Dateien gefunden haben.
2.- ls
Die GNU ls
akzeptiert das "Ende der Optionen" ( --
) Taste.
ls -d ./*/ ### More reliable BSD ls
ls -d -- */ ### More reliable GNU ls
3.-printf
Um jedes Verzeichnis in einer eigenen Zeile aufzulisten (in einer Spalte, ähnlich wie bei ls -1), verwenden Sie:
$ printf "%s\n" */ ### Correct even with "-", spaces or newlines.
Und noch besser wäre es, wenn wir das nachgestellte /
:
$ set -- */; printf "%s\n" "${@%/}" ### Correct with spaces and newlines.
Ein Versuch wie
$ for i in $(ls -d */); do echo ${i%%/}; done
scheitern wird:
- einige Namen (
ls -d */
) wie bereits oben gezeigt.
- wird beeinflusst durch den Wert von
IFS
.
- teilt Namen an Leerzeichen und Tabulatoren auf (mit Standard
IFS
).
- Mit jedem Zeilenumbruch im Namen wird ein neuer Echo-Befehl gestartet.
4.- Funktion
Schließlich hat die Verwendung der Argumentliste innerhalb einer Funktion keine Auswirkungen auf die Argumentliste der aktuell laufenden Shell. Einfach
$ listdirs(){ set -- */; printf "%s\n" "${@%/}"; }
$ listdirs
präsentiert diese Liste:
--
-
*
cs
dir with spaces
draft
files
-h
masters
-n
static
-v var
Diese Optionen sind bei verschiedenen Arten von ungeraden Dateinamen sicher.