221 votes

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

find . -type d

peut être utilisé pour trouver tous les répertoires en dessous d'un point de départ. Mais il retourne le répertoire courant ( . ) aussi, ce qui peut être indésirable. Comment l'exclure ?

246voto

Paramaeleon Points 1030

Non seulement la profondeur de récursion de find peuvent être contrôlés par le -maxdepth la profondeur peut également être limitée à partir de "haut" en utilisant le paramètre correspondant -mindepth paramètre. Donc, ce dont on a réellement besoin est :

find . -mindepth 1 -type d

6 votes

Fonctionne sur GNU find, mais malheureusement, il s'agit d'une extension gnu de l'application POSIX 7 find et même la LSB utilise les utilitaires POSIX (et non les utilitaires étendus de GNU).

10 votes

Cela a fonctionné pour moi. A savoir : find . -mindepth 1 -maxdepth 1 -type d ...

222voto

Ciro Santilli Points 3341

Solution POSIX 7 :

find . ! -path . -type d

Pour ce cas particulier ( . ), golfe mieux que le mindepth (24 contre 26 caractères), bien qu'il soit probablement un peu plus difficile à taper en raison de l'utilisation de l'option ! .

Pour exclure d'autres répertoires, cela gérera moins bien et nécessite une variable pour le DRYness :

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

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

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

0 votes

Si vous devez exclure plusieurs chemins, faites simplement find /path/ ! -path "/path/first" ! -path "/path/second" Est-ce le seul moyen ?

0 votes

Mon problème était le suivant : Je voulais supprimer récursivement tout ce qui se trouvait dans un répertoire, à l'exception d'un sous-répertoire. J'utilisais find con grep pour exclure le répertoire mais le répertoire parent était toujours là, entraînant la suppression de tout de toute façon.

0 votes

@VincentDeSmet je ne vois pas de solution directe avec find vous devez vérifier les préfixes : stackoverflow.com/questions/17959317/ Mais une boucle for en Bash peut le faire :-)

24voto

Milos Ivanovic Points 530

J'utilise find ./* <...> lorsque cela ne me dérange pas d'ignorer les dotfiles de premier niveau (les * glob ne correspond pas à ces éléments par défaut dans bash - voir l'option 'dotglob' dans le buildin shopt : 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

4voto

Michael.P Points 326

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

find * -type d

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

[Edit] : Comme @AlexanderMills l'a commenté, il n'affichera pas les répertoires cachés dans l'emplacement de la racine (ex. ./.hidden ), mais il montrera les sous-répertoires cachés (ex. ./folder/.hiddenSub ). [Testé avec git bash sous Windows].

0voto

Clement Points 51

Transmettez-le à sed. N'oubliez pas le -r qui étend l'expression régulière.

find . -type d | sed -r '/^\.$/d'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X