Commande Linux find - afficher la progression

24

Je me demandais s'il y avait un moyen d'afficher une sorte d'informations de progression lors de la recherche de fichiers sous Linux en utilisant find. Je me surprends souvent à la recherche de fichiers sur un grand disque et une sorte d'indicateur de progression serait très utile, comme un bar ou au moins le répertoire courant « trouver » des recherches dans. Y a-t- il des scripts qui font cela, ou ne prendre en findcharge certains crochets ?

Vlad Balmos
la source
merci pour les réponses, je vais vérifier toutes les solutions et décider laquelle est la meilleure. Si cela ne tenait qu'à moi, je marquerais toutes les réponses comme acceptées.
Vlad Balmos
selon les critères de recherche que vous utilisez, la localisation est beaucoup plus rapide que la recherche
B14D3

Réponses:

28

avec cette astuce, vous pouvez voir le dossier actuel - mais pas de barre de progression - désolé.

 watch readlink -f /proc/$(pidof find)/cwd
ThorstenS
la source
c'est super. Il convient de noter que vous avez besoin des privilèges de superutilisateur pour accéder à cwd. Merci!
Vlad Balmos
Fonctionne parfaitement.
Jesse Glick
8

Un petit utilitaire appelé pv (pipe viewer) peut vous aider. Extrait du fantastique résumé de Peteris Krumins:

La visionneuse de tuyaux est un outil basé sur un terminal pour surveiller la progression des données à travers un pipeline.

Vous pouvez utiliser pv de plusieurs façons. Lorsque je joue ici, je le mets immédiatement après un tuyau pour surveiller la progression de la sortie générée par find (devrait passer stdin à stdout sans toucher)

find / -mtime -1h | pv > /dev/null

qui affichera la sortie un peu comme ceci:

6.42MB 0:01:25 [31.7kB/s] [         <=>      ]

(J'ai redirigé stdout vers / dev / null pour que je puisse voir la barre de progression en action sans que la sortie ne passe. Ce n'est probablement pas votre intention avec find, alors adaptez-vous en conséquence)

Honnêtement, je ne sais pas si cela fonctionne bien dans la nature. Pour les trouvailles "chères" comme celle ci-dessus (traversant depuis la racine), cela semblait fonctionner assez bien. Pour des commandes plus simples dans un nœud plus profond de l'arborescence de répertoires, pv a lamentablement échoué. Ces commandes retournent immédiatement des résultats, donc une barre de progression est probablement sans objet ici.

Quoi qu'il en soit, jouez et voyez si cela fonctionne du tout pour ce dont vous avez besoin. Matière à réflexion, au moins.

tcdyl
la source
Que montrerait cette barre de progression? Ni find, ni pvsavoir combien de temps la recherche prendra, donc ils ne peuvent pas calculer le pourcentage. Tout ce que nous pouvons voir dans la pvsortie est le temps écoulé depuis le début de la recherche.
minaev
C'est correct. J'avais pensé qu'il y avait de la magie, quelque part, qui permettait à pv de vérifier la progression de la traversée du répertoire (ce qui est incorrect). Étant donné une entrée standard à un taux constant, pv déplace simplement la barre de progression à une fréquence constante. Essayez yes | pv > /dev/nulld'observer
tcdyl
1
+1 pour un bel utilitaire
Vlad Balmos
Juger des progrès n'est pas anodin. Même les navigateurs Web qui chargent des pages ne sont pas en mesure de le faire. Je suppose que pour le contenu des fichiers, vous pouvez diviser par la taille du fichier, mais pour les flux Unix, vous ne savez pas la quantité totale de données est généralement, et cet outil est censé être flexible pour tout type de données de flux, pas seulement les fichiers.
Sridhar Sarnobat
7

J'ai cherché cela aujourd'hui et suis arrivé ici via Google. J'ai eu une découverte de longue date sous OS X et, apparemment, watchn'existe pas là-bas. Voici donc une autre solution:

lsof -Fn -a -c find -d cwd +r 10

  • lsof = liste des fichiers ouverts
  • -Fn= juste montrer le nom du fichier / répertoire (préfixé avec le caractère 'n', sautez ceci si vous préférez la lsofsortie complète
  • -a= indique lsofd'afficher uniquement les lignes correspondant à tous les critères (par défaut, il affiche les lignes correspondant à tous les critères)
  • -c find= affiche les fichiers / répertoires ouverts par le processus nommé find(en fait, le processus dont le nom commence par find, mais il est sensible à la casse et Finderne s'affichera donc pas)
  • -d cwd = afficher les lignes avec FD (filedescriptor) cwd (répertoire de travail actuel)
  • +r 10 = afficher la sortie toutes les 10 secondes jusqu'à ce qu'aucun fichier ouvert ne soit trouvé (la recherche est terminée)

Cela montrera que le répertoire findest en cours de traitement toutes les 10 secondes, il devrait donc donner une idée s'il findfonctionne toujours et dans quelle mesure il a progressé.

Marie Fischer
la source
5

Il existe un exemple de recherches parallèles avec findin man find. En l'utilisant, vous pouvez effectuer plusieurs vérifications pour chaque élément, effectuer plusieurs actions selon la condition qui fonctionne. La première vérification peut être, par exemple, simple -print, donc tous les noms sont imprimés sur stdout. La deuxième vérification fera ce que vous voulez. Quelque chose comme:

find /work \( -fprint /dev/stderr \) , \( -name 'core' -exec rm {} \; \)

Si la deuxième vérification doit également afficher les noms de fichiers, vous pouvez rediriger l'un d'entre eux vers stderr en utilisant -fprint /dev/stderr.

minaev
la source
Je n'ai pas testé cela, mais je pense que c'est la bonne façon.
Rolf
2

AFAIK, ce n'est pas le cas, et sa mise en œuvre ne serait pas anodine.

... Hmm. Peut-être un script s'exécutant en find <target dir> -type dpremier, stockant la liste puis faisant écho à chaque dir avant d'exécuter un find <list item> -maxdepth 1 <rest of find parameters>dans une boucle for.

Notez que vous échangez une perte de performance / significative / en échange de pouvoir voir vaguement ce qu'il fait.

Shadur
la source
1

Ceci est une liste des fichiers actuels ouverts par find , donc c'est la même chose que ce que cherche "en ce moment".

Son adresse de requête légère et juste des descriptifs de fichiers utilisés par find chaque seconde et n'interfère pas avec find lui-même. Vous pouvez également le faire avec n'importe quel programme que vous souhaitez.

# watch -n 1 'ls -l /proc/$(pidof find)/fd | cut -d ">" -f 2 | grep -v /dev/'

Il grep -v /dev/s'agit de masquer les fichiers STDOUT, STDIN et STDERR, qui sont des fichiers utilisés pour recevoir et imprimer des données sur votre console.

Gabriel Saraiva
la source