find . -type d
peut être utilisé pour trouver tous les répertoires sous un certain point de départ. Mais il renvoie également le répertoire courant ( .
), ce qui peut être indésirable. Comment peut-il être exclu?
find . -type d
peut être utilisé pour trouver tous les répertoires sous un certain point de départ. Mais il renvoie également le répertoire courant ( .
), ce qui peut être indésirable. Comment peut-il être exclu?
Réponses:
find . ! -path . -type d
Pour ce cas particulier ( .
), les golfs sont meilleurs que la mindepth
solution (24 contre 26 caractères), bien que ce soit probablement un peu plus difficile à taper à cause du!
.
Pour exclure d'autres répertoires, cela jouera moins bien et nécessite une variable pour DRYness:
D="long_name"
find "$D" ! -path "$D" -type d
Mon arbre de décision entre !
et -mindepth
:
!
pour la portabilité..
? Jetez une pièce.long_name
? Utilisez -mindepth
.find / ! -regex '/\(a\|b\)/.*'
ou plus simplement, passer par grep. Pour ne pas récurer, ce qui précède serait très inefficace et vous devriez utiliser -prune
: stackoverflow.com/questions/1489277/…
find
avec grep
pour exclure le répertoire mais le répertoire parent était toujours là, ce qui a quand même tout supprimé.
find
, vous auriez besoin de vérifier les préfixes: stackoverflow.com/questions/17959317/... Mais une boucle Bash for peut le gérer :-)
\!
) pour être du bon côté. Tous les exemples de ma machine l' man find
ont échappé, il semble donc que ce soit probablement une bonne idée ™. Edit - Juste remarqué, il dit même explicitement:! expr True if expr is false. This character will also usually need protection from interpretation by the shell.
Non seulement la profondeur de récursivité de find
peut être contrôlée par le -maxdepth
paramètre, mais la profondeur peut également être limitée à partir du «haut» en utilisant le -mindepth
paramètre correspondant . Donc, ce dont on a réellement besoin, c'est:
find . -mindepth 1 -type d
find . -mindepth 1 -maxdepth 1 -type d ...
J'utilise find ./* <...>
quand cela ne me dérange pas d'ignorer les fichiers dotfiles de premier niveau (le *
glob ne les correspond pas par défaut dans bash - voir l'option 'dotglob' dans le shopt intégré: https://www.gnu.org/software/bash /manual/html_node/The-Shopt-Builtin.html ).
eclipse tmp # find. . ./écran ./screen/.testfile2 ./.X11-unix ./.ICE-unix ./tmux-0 ./tmux-0/default
eclipse tmp # find ./* ./écran ./screen/.testfile2 ./tmux-0 ./tmux-0/default
-exec
option. Par exemple, si vous essayez find dir/* -type d -exec rmdir {} \;
, vous verrez des erreurs.
rmdir
et vous diront probablement que les répertoires ne sont pas vides puisqu'ils find
effectueront une recherche approfondie dans les répertoires, montrant les parents avant leurs enfants.
Eh bien, une solution de contournement simple également (la solution ne fonctionnait pas pour moi sous windows git bash)
find * -type d
Ce n'est peut-être pas très performant, mais cela fait le travail, et c'est ce dont nous avons parfois besoin.
[Edit]: Comme @AlexanderMills l'a commenté, il ne montrera pas les répertoires cachés à l'emplacement racine (par exemple ./.hidden
), mais il affichera les sous-répertoires cachés (par exemple ./folder/.hiddenSub
). [Testé avec git bash sous Windows]
find /path/ ! -path "/path/first" ! -path "/path/second"
est-ce que c'est le seul moyen?