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 . ! -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 /path/ ! -path "/path/first" ! -path "/path/second"
est-ce que c'est le seul moyen?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
avecgrep
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:la source
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 ).la source
-exec
option. Par exemple, si vous essayezfind dir/* -type d -exec rmdir {} \;
, vous verrez des erreurs.rmdir
et vous diront probablement que les répertoires ne sont pas vides puisqu'ilsfind
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]la source