Ich habe einen Ordner mit einigen Verzeichnissen und einigen Dateien (einige sind versteckt, beginnend mit Punkt).
for d in *; do
echo $d
done
Alle Dateien werden durchlaufen, aber ich möchte nur Verzeichnisse durchlaufen. Wie mache ich das?
Sie können einen Schrägstrich am Ende angeben, um nur Verzeichnisse zu finden:
for d in */ ; do
echo "$d"
done
[[ -L $d ]]
ob $ d ein symbolischer Link ist.set -P
betrifft nur Befehle, die das Verzeichnis wechseln. sprunge.us/TNac[[ -L "$f" ]]
Symlinks werden in diesem Fall nicht mit ausgeschlossen*/
, Sie müssen den abschließenden Schrägstrich mit[[ -L "${f%/}" ]]
Sie können testen mit
-d
:Dies ist einer der Dateitestoperatoren .
quelle
if [[ -d "$f" && ! -L "$f" ]]
schließtif [[ "$f" = "*" ]]; then continue; fi
Beachten Sie, dass die elegante Lösung von choroba unerwartetes Verhalten hervorrufen kann, wenn im aktuellen Verzeichnis keine Verzeichnisse verfügbar sind. In diesem Zustand wird die
for
Schleife nicht übersprungen, sondern genau einmal ausgeführt, wobeid
gilt*/
:Ich empfehle Folgendes, um sich vor diesem Fall zu schützen:
Dieser Code durchläuft alle Dateien im aktuellen Verzeichnis, überprüft, ob
f
es sich um ein Verzeichnis handelt, und gibt ein Echo aus,f
wenn die Bedingung wahr ist. Wennf
gleich*/
,echo $f
wird nicht ausgeführt.quelle
shopt -s nullglob
.Wenn Sie spezifischere Dateien als nur Verzeichnisse auswählen müssen, verwenden Sie diese
find
und übergeben Sie sie anwhile read
:Verwenden Sie
shopt -u dotglob
diese Option, um versteckte Verzeichnisse (odersetopt dotglob
/unsetopt dotglob
in zsh) auszuschließen .IFS=
Um zu vermeiden, dass Dateinamen aufgeteilt werden, die eine der folgenden Angaben enthalten$IFS
:'a b'
siehe AsymLabs beantworten unten für weitere
find
Optionenedit:
Falls Sie einen Exit-Wert innerhalb der while-Schleife erstellen müssen, können Sie die zusätzliche Subshell mit folgendem Trick umgehen:
quelle
Sie können dafür reines bash verwenden, aber es ist besser, find zu verwenden:
(find schließt zusätzlich versteckte Verzeichnisse ein)
quelle
shopt -s dotglob
for verwendenbash
, um versteckte Verzeichnisse einzuschließen. Ihr wird auch enthalten.
. Beachten Sie auch, dass dies-maxdepth
keine Standardoption-prune
ist.dotglob
Option ist interessant,dotglob
gilt aber nur für die Verwendung von*
.find .
wird immer versteckte Verzeichnisse (und das aktuelle Verzeichnis auch) enthaltenDies geschieht, um sowohl sichtbare als auch versteckte Verzeichnisse im aktuellen Arbeitsverzeichnis zu finden, mit Ausnahme des Stammverzeichnisses:
So durchlaufen Sie Verzeichnisse:
Symlinks in das Ergebnis aufnehmen:
Um etwas mit jedem Verzeichnis zu tun (außer Symlinks):
versteckte Verzeichnisse ausschließen:
So führen Sie mehrere Befehle für die zurückgegebenen Werte aus (ein sehr ausgeklügeltes Beispiel):
Anstelle von 'sh -c' kann auch 'bash -c' usw. verwendet werden.
quelle
... -print0 | xargs -0 ...
wenn Sie die genauen Namen nicht kennen.find * | while read file; do ...
Sie können alle Verzeichnisse einschließlich versteckter Verzeichnisse (beginnend mit einem Punkt) in einer Zeile und mit mehreren Befehlen durchlaufen:
Wenn Sie Symlinks ausschließen möchten:
Hinweis: die Liste mit
*/ .*/
Arbeiten in der Bash, sondern zeigt auch die Ordner.
und..
während in zsh wird es nicht diese zeigt aber einen Fehler aus , wenn es keine versteckte Datei in dem Ordner istEine sauberere Version, die versteckte Verzeichnisse enthält und ../ ausschließt, enthält die Option dotglob:
(oder
setopt dotglob
in zsh)Sie können dotglob mit deaktivieren
quelle
Dies wird den vollständigen Pfad in jedem Verzeichnis in der Liste enthalten:
quelle
Verwenden Sie
find
mit-exec
, um die Verzeichnisse zu durchlaufen und eine Funktion in der Option exec aufzurufen :Verwenden Sie
shopt -s dotglob
odershopt -u dotglob
, um versteckte Verzeichnisse ein- oder auszuschließenquelle
Dies listet alle Verzeichnisse zusammen mit der Anzahl der Unterverzeichnisse in einem bestimmten Pfad auf:
quelle
quelle
This
is
one
directory
with
spaces
in
the
name
- aber wird als mehrere analysiert.oder:
Sie können es als Alias festlegen
quelle
ls
Antwort unterscheidet, in der Verzeichnisse aufgelistet sind .ls
: mywiki.wooledge.org/ParsingLs