1273 Stimmen

Auflistung nur Verzeichnisse mit ls in Bash?

Dieser Befehl listet Verzeichnisse im aktuellen Pfad auf:

ls -d */

Was genau bedeutet das Muster */ tun?

Und wie können wir den absoluten Pfad im obigen Befehl angeben (z. B. ls -d /home/alice/Documents ), um nur Verzeichnisse in diesem Pfad aufzulisten?

1314voto

Gordon Davisson Punkte 105638

*/ ist ein Muster, das auf alle Unterverzeichnisse des aktuellen Verzeichnisses ( * würde auf alle Dateien zutreffen そして Unterverzeichnisse; die / schränkt es auf Verzeichnisse ein). Um alle Unterverzeichnisse unter /home/alice/Documents aufzulisten, verwenden Sie analog dazu ls -d /home/alice/Documents/*/

610voto

Albert Punkte 9839

Es gibt vier Möglichkeiten, dies zu erreichen, jede mit einem anderen Ausgabeformat

1. Verwendung von echo

Beispiel: echo */ , echo */*/
Hier ist, was ich bekommen habe:

cs/ draft/ files/ hacks/ masters/ static/  
cs/code/ files/images/ static/images/ static/stylesheets/  

2. Verwendung von ls nur

Beispiel: ls -d */
Hier ist genau das, was ich bekommen habe:

cs/     files/      masters/  
draft/  hacks/      static/  

Oder als Liste (mit Detailinformationen): ls -dl */

3. Verwendung von ls y grep

Beispiel: ls -l | grep "^d" Hier ist, was ich bekommen habe:

drwxr-xr-x  24 h  staff     816 Jun  8 10:55 cs  
drwxr-xr-x   6 h  staff     204 Jun  8 10:55 draft  
drwxr-xr-x   9 h  staff     306 Jun  8 10:55 files  
drwxr-xr-x   2 h  staff      68 Jun  9 13:19 hacks  
drwxr-xr-x   6 h  staff     204 Jun  8 10:55 masters  
drwxr-xr-x   4 h  staff     136 Jun  8 10:55 static  

4. Bash-Skript (nicht empfohlen für Dateinamen mit Leerzeichen)

Beispiel: for i in $(ls -d */); do echo ${i%%/}; done
Hier ist, was ich bekommen habe:

cs  
draft  
files  
hacks  
masters  
static

Wenn Sie '/' als Endzeichen verwenden möchten, lautet der Befehl wie folgt: for i in $(ls -d */); do echo ${i}; done

cs/  
draft/  
files/  
hacks/  
masters/  
static/

135voto

Ich benutze:

ls -d */ | cut -f1 -d'/'

Dadurch wird eine einzelne Spalte ohne abschließenden Schrägstrich erstellt - nützlich in Skripten.

85voto

at3m Punkte 841

Für alle Ordner ohne Unterordner:

find /home/alice/Documents -maxdepth 1 -type d

Für alle Ordner con Unterordner:

find /home/alice/Documents -type d

46voto

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X