Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 07/10/2008, à 16:48

daftdef

Commandes bash : performance pour compter le nb de fichiers d'un rép

Bonjour à tous

Je cherche à compter le nombre de fichiers d'un répertoire

Actuellement j'utilise la commande suivante

find mondossierquilestbeau -type f | wc -l

qui me donne bien le résultat escompté.

Cependant, je cherche une commande susceptible de faire la même chose, mais plus rapidement (le dossier compte un peu plus de 80 000 fichiers et s'exécutent en environ 2 minutes 30. Pour bien faire, il faudrait une exécution au moins deux fois plus rapide.)

Si il existe une commande (autre que du, permettant d'obtenir le poids des fichiers de manière rapide, je suis preneur aussi)

Je ne cherche pas spécialement à réinventer la roue... Si il n'existe pas plus rapide que le find et le du, je m'en contenterai... Mais comme je ne sais pas vraiment si ces commandes sont vraiment optimisées, je préfère poser la question wink

merci d'avance pour vos réponses smile

#2 Le 07/10/2008, à 18:04

kordan

Re : Commandes bash : performance pour compter le nb de fichiers d'un rép

Salut

Je ne connais pas de commandes mais tu peux essayer un script pyton (ou autres), ça sera peut-être plus rapide :

#!/usr/bin/env python
import os, sys

n = 0
for f in os.walk(sys.argv[1]): 
	n += len(f[2])
print n

puis tu lances : script.py 'mondossierquilestbeau'

a+

#3 Le 07/10/2008, à 18:11

frafa

Re : Commandes bash : performance pour compter le nb de fichiers d'un rép

lo,
peut etre
cd /media && ls -AR | wc -l
sinon passer avec une recherche dans base de données
genre updatedb et locate...

Dernière modification par frafa (Le 07/10/2008, à 18:12)

Hors ligne

#4 Le 07/10/2008, à 18:18

aeacides

Re : Commandes bash : performance pour compter le nb de fichiers d'un rép

faudrait que tu fasses un benchmark en fait de toutes ces opérations pour voir laquelle est la plus rapide pour un volume donné ...

Mais si je ne me trompe pas, Perl reste un langage scripté de mise pour ce genre de truc. Qu'importe celui que tu utilises, tant que ça fonctionne .... Mais j'aurais tendance a croire que Bash est plus rapide que Python pour ce genre d'opération, mais je touche du bois. roll

Dernière modification par aeacides (Le 07/10/2008, à 18:19)


http://www.q-be.ca

Hors ligne

#5 Le 07/10/2008, à 18:21

lawl

Re : Commandes bash : performance pour compter le nb de fichiers d'un rép

tu n'a que des fichier dedans ?
Parce que peut etre qu'un

ls -1 | wc -l

est peut etre plus rapide mais ca compte les dossiers.

Dernière modification par lawl (Le 07/10/2008, à 18:23)

Hors ligne

#6 Le 07/10/2008, à 21:27

Link31

Re : Commandes bash : performance pour compter le nb de fichiers d'un rép

Je ne pense pas que tu puisses beaucoup optimiser cette opération. Il n'y a pas de commande retournant le nombre de fichiers qui ne nécessite pas de lire tous les dossier un par un.

C'est la vitesse du disque dur qui plombe le temps d'exécution (et dans une moindre mesure, la vitesse du système de fichiers). Le programme peut-être écrit dans n'importe quel langage, ça ne changera pas grand chose.

Si tu veux aller plus vite, il y a plusieurs possibilités :
- trouve un disque dur plus rapide
- change de système de fichiers, par exemple pour reiser4
- copie tous les fichiers en RAM (dans un tmpfs, ou dans le cache en lisant tous les dossiers à l'avance) avant de lancer la commande

Hors ligne

#7 Le 07/10/2008, à 22:25

kordan

Re : Commandes bash : performance pour compter le nb de fichiers d'un rép

Link31 a écrit :

Je ne pense pas que tu puisses beaucoup optimiser cette opération. ...
Le programme peut-être écrit dans n'importe quel langage, ça ne changera pas grand chose.

Ce n'est pas ce que montrent les deux ou trois tests que je viens de faire.
Le script python que j'ai donné plus haut est assez nettement plus rapide que "find dossier -type f | wc -l". Il a même été trois fois plus rapide sur un gros dossier stocké sur un disque dur externe usb2.
Il faudrait voir si find à une option pour cela, ça accélérerait peut-être l'opération.

Sinon il doit y avoir une erreur dans le premier poste. 2 minutes 30 pour 80.000 fichiers, ça serait énorme; peut-être 2 seconde 30 ou alors il y a beaucoup plus de fichiers (ou alors l'accès au disque est vraiment extrêmement lent et dans ce cas effectivement changer de programme de servirait pas à grand chose).

#8 Le 07/10/2008, à 22:41

Link31

Re : Commandes bash : performance pour compter le nb de fichiers d'un rép

kordan a écrit :

Ce n'est pas ce que montrent les deux ou trois tests que je viens de faire.
Le script python que j'ai donné plus haut est assez nettement plus rapide que "find dossier -type f | wc -l". Il a même été trois fois plus rapide sur un gros dossier stocké sur un disque dur externe usb2.

Je suppose que tu as comparé le temps d'exécution en lançant find ..., puis en lançant ton script. Rien de surprenant dans ce cas.

Ça devrait remettre les choses en place pour un vrai benchmark :

echo 1 | sudo tee /proc/sys/vm/drop_caches
kordan a écrit :

Il faudrait voir si find à une option pour cela, ça accélérerait peut-être l'opération.

Oui, une option du genre -fast ou -optimized... Voire une macro du type #define OPTIMIZE_CODE ou quelque chose de ce genre...
Tu as plein d'exemples d'"options" de ce type sur le forum Gentoo. Cherche le terme "ricer" tongue

Hors ligne

#9 Le 07/10/2008, à 22:53

kordan

Re : Commandes bash : performance pour compter le nb de fichiers d'un rép

ah oui, tu as raison big_smile
Le temps est le même en réalité roll

#10 Le 08/10/2008, à 08:20

daftdef

Re : Commandes bash : performance pour compter le nb de fichiers d'un rép

merci pour les réponses...

Alors en vrac :

peut etre
cd /media && ls -AR | wc -l
sinon passer avec une recherche dans base de données

le ls ou le find, c'est kif kif en terme de temps d'exécution (le find est un peu plus rapide quand même !!)

Je ne pense pas que tu puisses beaucoup optimiser cette opération. Il n'y a pas de commande retournant le nombre de fichiers qui ne nécessite pas de lire tous les dossier un par un.

C'est la vitesse du disque dur qui plombe le temps d'exécution (et dans une moindre mesure, la vitesse du système de fichiers). Le programme peut-être écrit dans n'importe quel langage, ça ne changera pas grand chose.

Si tu veux aller plus vite, il y a plusieurs possibilités :
- trouve un disque dur plus rapide
- change de système de fichiers, par exemple pour reiser4
- copie tous les fichiers en RAM (dans un tmpfs, ou dans le cache en lisant tous les dossiers à l'avance) avant de lancer la commande

C'est bien ça qui me fait peur. M'enfin je m'en arrangerai.

Sinon il doit y avoir une erreur dans le premier poste. 2 minutes 30 pour 80.000 fichiers, ça serait énorme; peut-être 2 seconde 30 ou alors il y a beaucoup plus de fichiers (ou alors l'accès au disque est vraiment extrêmement lent et dans ce cas effectivement changer de programme de servirait pas à grand chose).

Pas d'erreur, le disque a énormément d'accès et est très chargé (serveur de fichier) et il s'agit d'un montage (ce qui n'arrange sans doute rien à la rapidité d'exécution !!)

ah oui, tu as raison
Le temps est le même en réalité

ouf !! mettre les mains dans le python, hum wink ... ça me faisait un peu peur quand même !!

#11 Le 08/10/2008, à 08:35

cep

Re : Commandes bash : performance pour compter le nb de fichiers d'un rép

daftdef a écrit :

merci pour les réponses...

Alors en vrac :

peut etre
cd /media && ls -AR | wc -l
sinon passer avec une recherche dans base de données

le ls ou le find, c'est kif kif en terme de temps d'exécution (le find est un peu plus rapide quand même !!)

Oui, pas de différ'ence significative entre find et ls. Testé sur 180.000 fichiers.
Il me semble avoir lu que tu voulais uniquement décompter les fichiers et répertoires, mais exclure du décompte le nombre de répertoires, ce que ne fait pas ta commande.

ls -lRA ton_rep | grep -c '^-'

devrait en tenir compte.

Hors ligne

#12 Le 08/10/2008, à 08:46

daftdef

Re : Commandes bash : performance pour compter le nb de fichiers d'un rép

en fait ce n'est pas exactement ça.

dans un premier temps, je compte les éventuels répertoires présents. Comme je ne veux pas avoir de répertoire, si il y en a plus d'un, ça fait erreur et le comptage des fichiers ne s'exécute pas.

Alors à moins qu'un répertoire ne se créer dans le laps de temps d'exécution de mes 2 commandes (ce qui ne serait pas de bol !!), je n'ai pas besoin de me soucier de la prise en compte ou non des répertoires lorsque je compte mes fichiers (et puis ça doit gagner en perf du coup)

Je suis amené à lancer ces commandes régulièrement via un script, donc si un répertoire n'est pas détecté à la 1ère exécution, il le sera à la 2nde. En attendant, ce n'est pas dramatique wink

#13 Le 08/10/2008, à 10:41

cep

Re : Commandes bash : performance pour compter le nb de fichiers d'un rép

tu as aussi tree qui est rapide.

Par exemple :
tree -a ton_repertoire |egrep "directories|files "
va décompter répertoires et fichiers.

Tu peux demamder à ce qu'il n'affiche que fichiers bien sûr.

tree -a |egrep "directories|files "| awk  '{ print $3}'

Hors ligne