it-swarm.com.de

So schließen Sie diesen Ordner/current/dot von find "type d" aus

find . -type d

kann verwendet werden, um alle Verzeichnisse unter einem bestimmten Startpunkt zu finden. Es wird jedoch auch das aktuelle Verzeichnis (.) zurückgegeben, was möglicherweise unerwünscht ist. Wie kann es ausgeschlossen werden?

145
Paramaeleon

POSIX 7-Lösung :

find . ! -path . -type d

Für diesen speziellen Fall (.) ist der Golfsport besser als die mindepth-Lösung (24 oder 26 Zeichen), obwohl dies aufgrund des ! wahrscheinlich etwas schwieriger einzugeben ist.

Um andere Verzeichnisse auszuschließen, wird dies weniger gut funktionieren und erfordert eine Variable für DRYness:

D="long_name"
find "$D" ! -path "$D" -type d

Mein Entscheidungsbaum zwischen ! und -mindepth:

  • skript? Verwenden Sie ! für die Portabilität.
  • interaktive Sitzung auf GNU?
    • . ausschließen? Wirf eine Münze.
    • long_name ausschließen? Verwenden Sie -mindepth.

Mit dem -maxdepth-Parameter kann nicht nur die Rekursionstiefe von find gesteuert werden, sondern die Tiefe kann auch mit dem entsprechenden -mindepth-Parameter von oben begrenzt werden. Was man eigentlich braucht, ist:

find . -mindepth 1 -type d
160
Paramaeleon

Ich verwende find ./* <...>, wenn es mir nichts ausmacht, Dot-Dateien der ersten Ebene zu ignorieren (der *-Glob stimmt nicht standardmäßig mit diesen in bash überein - siehe die Option 'dotglob' im shopt builtin: https://www.gnu.org) /software/bash/manual/html_node/The-Shopt-Builtin.html ).

 Eclipse tmp # find .
.
./screen 
./screen/.testfile2 
. /. X11-unix 
. /. ICE-unix 
./tmux-0 
./tmux-0/default 
 Eclipse tmp # find ./*
./screen
./screen/.testfile2
./tmux-0
./tmux-0/default
18
Milos Ivanovic

Nun, eine einfache Problemumgehung (die Lösung funktionierte bei git bash für mich nicht)

find * -type d

Es ist vielleicht nicht sehr leistungsfähig, aber es erledigt die Arbeit, und manchmal brauchen wir es.

0
StackHola