première option dans l'utilitaire de recherche Linux?


12

Existe-t-il une option en largeur / profondeur en premier dans l'utilitaire de recherche Linux?

Réponses:


5

Il n'y a rien de intégré à trouver, même GNU find. Vous pouvez post-traiter la sortie de findpour trier par nombre de barres obliques, par exemple avec Perl:

find ... | perl -e 'print sort {$a=~s!/!/! <=> $b=~s!/!/!} <>'
  • <> est la liste de toutes les lignes d'entrée;
  • $a =~ s!/!/!gest le nombre de barres obliques $a, que nous utilisons comme critère de tri.

Si vous pouvez utiliser zsh:

echo **/*(oe\''REPLY=${REPLY//[^\/]}'\')
  • **/* répertorie tous les fichiers du répertoire et des sous-répertoires actuels.
  • Le contenu entre parenthèses est un qualificatif glob.
  • Le qualificatif glob oecontrôle l'ordre dans lequel les correspondances sont retournées: elles sont triées par la valeur REPLYaprès avoir exécuté le code ici entre guillemets pour chaque correspondance avec REPLYinitialement défini sur le chemin correspondant.
  • Ce code se transforme $REPLYpour tout supprimer sauf les barres obliques. Donc, le résultat se compose de tout à la profondeur 1 (résultat vide $REPLY), puis de tout à la profondeur 2 ( $REPLYfinit par l'être /), la profondeur 3 ( //), etc.

1
Le tri post-processus est très intéressant, cependant, le tri doit être terminé et vous n'aurez pas la possibilité de contrôler la pause.
Xiè Jìléi


1

Mon sentiment est que vous le pouvez. Cela implique grep et autres et une boucle, mais je trouve que cela fonctionne très bien, en particulier pour votre cas concernant la recherche n'ayant pas besoin d'être terminée.

Il consomme plus de ressources en raison de:

  • Beaucoup de fourches
  • Beaucoup de trouvailles
  • Chaque répertoire avant la profondeur actuelle est atteint par find autant de fois qu'il y a de profondeur totale dans la structure du fichier (cela ne devrait pas être un problème si vous avez pratiquement n'importe quelle quantité de RAM ...)

C'est bien parce que:

  • Il utilise des outils bash et gnu de base
  • Il peut être cassé quand vous le souhaitez (comme si vous voyez ce que vous cherchiez à voler)
  • Cela fonctionne par ligne et non par recherche, donc les commandes suivantes n'ont pas à attendre une recherche et un tri
  • Il fonctionne en fonction de la séparation réelle du système de fichiers, donc si vous avez un répertoire avec une barre oblique, il ne sera pas répertorié plus profondément qu'il ne l'est; si vous avez configuré un séparateur de chemin différent, tout va bien.
#! / bin / bash 
profondeur = 0

tout en trouvant -mindepth $ depth -maxdepth $ depth | grep '.'
faire
    profondeur = $ ((profondeur + 1))
terminé

Vous pouvez également l'ajuster sur une seule ligne assez (?) Facilement:

depth=0; while find -mindepth $depth -maxdepth $depth | grep --color=never '.'; do depth=$((depth + 1)); done

Mais je préfère les petits scripts à la frappe ...

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.