web-dev-qa-db-fra.com

Comment exclure ce dossier/courant/point de la recherche "type d"

find . -type d

peut être utilisé pour trouver tous les répertoires ci-dessous un point de départ. Mais il renvoie également le répertoire en cours (.), ce qui peut être indésirable. Comment peut-il être exclu?

145
Paramaeleon

solution POSIX 7 :

find . ! -path . -type d

Pour ce cas particulier (.), les golfs sont meilleurs que la solution mindepth (24 vs 26 caractères), bien que cela soit probablement un peu plus difficile à taper à cause du !.

Pour exclure d’autres répertoires, le golf sera moins efficace et nécessitera une variable pour DRYness:

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

Mon arbre de décision entre ! et -mindepth:

  • scénario? Utilisez ! pour la portabilité.
  • session interactive sur GNU?
    • exclure .? Jeter une pièce.
    • exclure long_name? Utilisez -mindepth.

Non seulement la profondeur de récursivité de find peut être contrôlée par le paramètre -maxdepth, mais elle peut également être limitée à partir du début en utilisant le paramètre -mindepth correspondant. Donc, ce dont on a réellement besoin, c'est:

find . -mindepth 1 -type d
160
Paramaeleon

J'utilise find ./* <...> quand ignorer les fichiers dot de premier niveau ne me dérange pas (le * glob ne correspond pas à ceux-ci par défaut sous bash - voir l'option 'dotglob' dans la commande shopt intégrée: 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

Eh bien, une solution de contournement simple également (la solution ne fonctionnait pas pour moi sur git bash)

find * -type d

Ce n'est peut-être pas très performant, mais le travail est fait et c'est ce dont nous avons parfois besoin.

0
StackHola