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?
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?
Antworten:
find . ! -path . -type d
In diesem speziellen Fall ( .
) ist Golf besser als die mindepth
Lö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
:
!
für Portabilität..
? Wirf eine Münze.long_name
? Verwenden Sie -mindepth
.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/…
find
with verwendet grep
, um das Verzeichnis auszuschließen, aber das übergeordnete Verzeichnis war noch vorhanden, sodass ohnehin alles gelöscht wurde.
find
, Sie müssten nach Präfixen suchen : stackoverflow.com/questions/17959317/… Aber eine Bash for-Schleife kann damit umgehen :-)
\!
) entkommen , um auf der sicheren Seite zu sein. Alle Beispiele in meiner Maschine man find
haben 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.
find
Durch den -maxdepth
Parameter kann nicht nur die Rekursionstiefe von gesteuert werden, sondern auch die Tiefe von „oben“ mit dem entsprechenden -mindepth
Parameter begrenzt werden. Was man also wirklich braucht, ist:
find . -mindepth 1 -type d
find . -mindepth 1 -maxdepth 1 -type d ...
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
-exec
Option. Wenn Sie es beispielsweise versuchen find dir/* -type d -exec rmdir {} \;
, werden Fehler angezeigt.
rmdir
und sagen Ihnen höchstwahrscheinlich, dass die Verzeichnisse nicht leer sind, da find
eine gründliche Suche in den Verzeichnissen durchgeführt wird, bei der die Eltern vor ihren Kindern angezeigt werden.
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]
find /path/ ! -path "/path/first" ! -path "/path/second"
ist dies nur der richtige Weg?