Le -depth
principal qui lui find
fait effectuer une recherche en profondeur d'abord.
Cependant, la séquence par défaut n'est pas une recherche étendue.
La séquence par défaut pourrait être décrite de manière informelle comme une «traversée en profondeur d'abord qui gère les nœuds lorsqu'ils sont rencontrés pour la première fois plutôt que de le faire pendant le retour en arrière».
J'ai un réel besoin de recherche approfondie. Comment puis-je me find
comporter de cette façon?
Pour illustration, avec la configuration suivante:
$ mkdir -p alpha/{bravo,charlie,delta}
$ touch alpha/charlie/{alpha,beta,gamma,phi}
find
a le comportement par défaut suivant:
$ find alpha
alpha
alpha/charlie
alpha/charlie/alpha
alpha/charlie/phi
alpha/charlie/beta
alpha/charlie/gamma
alpha/delta
alpha/bravo
et avec -depth
, il fonctionne comme suit:
$ find alpha -depth
alpha/charlie/alpha
alpha/charlie/phi
alpha/charlie/beta
alpha/charlie/gamma
alpha/charlie
alpha/delta
alpha/bravo
alpha
Cependant, ce que je veux, c'est l'option (fictive) suivante:
$ find alpha -bfs
alpha
alpha/charlie
alpha/delta
alpha/bravo
alpha/charlie/alpha
alpha/charlie/phi
alpha/charlie/beta
alpha/charlie/gamma
En d'autres termes, je dois find
traiter / signaler tous les fichiers / répertoires à une profondeur donnée avant de poursuivre.
Comment puis-je faire ceci?
find
(du moins, pas seulementfind
). Souhaitez-vous uniquement lister les fichiers ou souhaitez-vous utiliser d'autres primaires?-bfs
ce ne serait pas tout à fait ce dont j'ai besoin ... J'ai un script simple qui génère un index pour un grand projet GitLab, adapté à l'inclusion dans le Wiki GitLab. Il rend les en-têtes hiérarchiquement basés sur les noms de répertoire. Cela fonctionne très bien, sauf que dans l'exemple de structure de fichier ci-dessus, il serait placédelta
sous le sous-en-charlie
tête, plutôt que sous l'en-alpha
tête parent .find
sortie est triée par ordre alphabétique. Aucune idée pourquoi ....-bfs
pourrait être utile, même si cela ne correspond pas parfaitement à ce cas d'utilisation.Réponses:
Vous pouvez le faire avec simplement des caractères génériques shell. Construisez un modèle avec progressivement plus de niveaux de répertoire.
Cela manque les fichiers de points. Utilisez-les
FIGNORE='.?(.)'
en ksh,shopt -s dotglob
en bash ousetopt glob_dots
en zsh pour les inclure.Mises en garde:
Si vous souhaitez choisir l'ordre ou les répertoires et les non-répertoires et que les performances ne sont pas critiques, vous pouvez effectuer deux passes et tester
[ -d "$file" ]
à chaque passe.la source
*
. :)nullglob
et utilisez(($#))
comme condition de boucle pour éviter ce cas de bord.# cat ./bfind
Cela fonctionne en augmentant la profondeur
find
et en répétant, je pense que cela peut répéter les résultats, mais pourrait être filtré facilementla source
Vous pouvez diriger votre
find
dans un tri qui trie principalement par le nombre de/
caractères dans le chemin d'accès. Par exemple,Cela permet
awk
de préfixer le chemin d'accès avec le nombre de barres obliques etsed
de supprimer ce préfixe à la fin.En fait, comme vous voulez probablement que le contenu du répertoire
alpha/charlie+
soit répertorié aprèsalpha/charlie
, vous devez diresort -t/ -k1,1 -k2,2 -k3,3 -k4,4
jusqu'à la profondeur souhaitée.la source
Une autre réponse non basée sur 'find' mais sur bash - utilisez d'abord la "longueur du répertoire parent", puis triez par alpha.
La réponse ne correspond pas tout à fait car vos résultats ont "charlie, bravo, delta" mais je me demandais si ce devait être "bravo, charlie, delta" en ordre alpha.
Cela produit
la source