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

186
find . -type d

kann verwendet werden, um alle Verzeichnisse unterhalb eines Startpunkts zu finden. Es wird aber auch das aktuelle Verzeichnis ( .) zurückgegeben, was möglicherweise unerwünscht ist. Wie kann es ausgeschlossen werden?

Matthias Ronge
quelle

Antworten:

193

POSIX 7-Lösung :

find . ! -path . -type d

In diesem speziellen Fall ( .) ist Golf besser als die mindepthLösung (24 vs 26 Zeichen), obwohl dies aufgrund der !.

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

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

Mein Entscheidungsbaum zwischen !und -mindepth:

  • Skript? Verwendung !für Portabilität.
  • interaktive Sitzung auf GNU?
    • ausschließen .? Wirf eine Münze.
    • ausschließen long_name? Verwenden Sie -mindepth.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
Wenn Sie mehrere Pfade ausschließen müssen, find /path/ ! -path "/path/first" ! -path "/path/second"ist dies nur der richtige Weg?
Vincent De Smet
2
@VincentDeSmet Möchten Sie nur diese Pfade ausschließen oder tatsächlich nicht in sie zurückgreifen? Wenn nur die Pfade, können Sie verwenden find / ! -regex '/\(a\|b\)/.*'oder einfacher durch grep leiten. Um nicht zu rekursieren, wäre das oben genannte sehr ineffizient und Sie sollten verwenden -prune: stackoverflow.com/questions/1489277/…
Ciro Santilli 法轮功 冠状 病 六四 事件 28
Mein Problem war wie folgt: Ich wollte rekursiv alles in einem Verzeichnis außer 1 Unterverzeichnis löschen. Ich habe findwith verwendet grep, um das Verzeichnis auszuschließen, aber das übergeordnete Verzeichnis war noch vorhanden, sodass ohnehin alles gelöscht wurde.
Vincent De Smet
@VincentDeSmet Ich sehe keine direkte Lösung mit find, Sie müssten nach Präfixen suchen : stackoverflow.com/questions/17959317/… Aber eine Bash for-Schleife kann damit umgehen :-)
Ciro Santilli 郝海东 冠状 病 六四 事件法轮功
Sie möchten wahrscheinlich dem Ausrufezeichen char ( \!) entkommen , um auf der sicheren Seite zu sein. Alle Beispiele in meiner Maschine man findhaben es entkommen, so dass es scheint, als wäre es wahrscheinlich eine gute Idee ™. Bearbeiten - Gerade bemerkt, dass es sogar explizit sagt:! expr True if expr is false. This character will also usually need protection from interpretation by the shell.
Adrian Günter
199

findDurch den -maxdepthParameter kann nicht nur die Rekursionstiefe von gesteuert werden, sondern auch die Tiefe von „oben“ mit dem entsprechenden -mindepthParameter begrenzt werden. Was man also wirklich braucht, ist:

find . -mindepth 1 -type d
Matthias Ronge
quelle
5
funktioniert mit GNU find, ist aber leider eine Gnu-Erweiterung für POSIX 7 find , und selbst das LSB verwendet POSIX-Shell-Dienstprogramme (nicht die erweiterten GNU-Dienstprogramme)
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功
6
Das hat bei mir funktioniert. Nämlich:find . -mindepth 1 -maxdepth 1 -type d ...
racl101
19

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

Eclipse tmp # find.
.
./Bildschirm
./screen/.testfile2
./.X11-unix
./.ICE-unix
./tmux-0
./tmux-0/default
Eclipse tmp # find ./*
./Bildschirm
./screen/.testfile2
./tmux-0
./tmux-0/default
Milos Ivanovic
quelle
Zu Ihrer Information. Verwenden Sie diesen Trick nicht mit -execOption. Wenn Sie es beispielsweise versuchen find dir/* -type d -exec rmdir {} \;, werden Fehler angezeigt.
Plhn
Sie irren sich oder sind vielleicht falsch beraten. Dieser Befehl wird gut funktionieren. Wenn Sie Fehler sehen, kommen diese von rmdirund sagen Ihnen höchstwahrscheinlich, dass die Verzeichnisse nicht leer sind, da findeine gründliche Suche in den Verzeichnissen durchgeführt wird, bei der die Eltern vor ihren Kindern angezeigt werden.
Milos Ivanovic
2
Hinweis: "Punktdateien der ersten Ebene ignorieren" bedeutet auch, alle versteckten Dateien / Verzeichnisse auszuschließen.
Jonathan H
2

Nun, eine einfache Problemumgehung (die Lösung funktionierte bei Windows Git Bash nicht für mich)

find * -type d

Es ist vielleicht nicht sehr performant, erledigt aber die Arbeit, und es ist das, was wir manchmal brauchen.

[Bearbeiten]: Wie @AlexanderMills kommentierte, werden keine versteckten Verzeichnisse im Stammverzeichnis angezeigt ./.hidden(z. B. ), aber versteckte Unterverzeichnisse (z. B. ./folder/.hiddenSub). [Getestet mit Git Bash unter Windows]

StackHola
quelle