Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1490 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  script: nombre de répertoires,fichiers

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

script: nombre de répertoires,fichiers

n°1774365
Neenou
Posté le 19-08-2008 à 10:17:20  profilanswer
 

Salut à tous :)
 
J'aimerai faire un script qui me permettrai à son lancement de me donner le nombre de tout les répertoires et fichiers qui se trouvent dans mon répertoire courant.
 
Je m'explique: je suis dans le répertoire /offres où se trouvent plusieurs dossiers d'affaire. Lorsque je lancerai mon petit programme dans mon répertoire courant (ici /offres), je saurais, pour chaque affaires contenu dans ce répertoire, le nombre de fichiers et de répertoires qu'ils contiennent (et si possible même la taille de répertoire de chaque affaires.)
 
J'aimerai que le résultat soit envoyé dans un fichier qui contiendra pour chaque ligne le nom du répertoire d'affaire avec son nombre de répertoire et de fichier ainsi que sa taille.
 
Je pense qu'il faudrait une boucle for avec la commande find pour compter le nombre de fichiers et de répertoires.. (find . -type d | wc -l et find . -type f | wc -l) et la redirection >> pour écrire le résultat dans un fichier. Mais j'ai bien du mal à contruire tout ça !!
 
 
Je dois le faire assez rapidement :/
Si vous pouvez m'aider, me donner une trame ou autre, je suis partante :D
 
Merci  ;)

mood
Publicité
Posté le 19-08-2008 à 10:17:20  profilanswer
 

n°1774367
Elmoricq
Modérateur
Posté le 19-08-2008 à 10:20:40  profilanswer
 

Tu as tout fait pourtant.

 

Pour les répertoires :
find /offres -type d | wc -l >> fichier_de_résultat

 

Pour les fichiers :
find /offres -type f | wc -l >> fichier_de_résultat

 


Plus d'information en tapant man find :)


Message édité par Elmoricq le 19-08-2008 à 10:21:03
n°1774373
Neenou
Posté le 19-08-2008 à 10:29:33  profilanswer
 

Merci, c'est vrai que je ne suis pas loin.. mais je pense qu'il faut que je fasse une boucle for pour que, pour chaque répertoire contenus dans /offres, j'obtienne son nombre de répertoires et de fichiers ainsi que sa taille :/
 
Et qu'également mon fichier créé ressemble à ça:
Nom_daffaire         Nbre_rép      Nbre_fichiers         taille
 
C'est là que ça se complique ^^

n°1774383
Elmoricq
Modérateur
Posté le 19-08-2008 à 10:59:10  profilanswer
 

Ah. Il te faut savoir que find est récursif : si tu ne lui dis pas le contraire, il va parcourir tous les sous-répertoires jusqu'aux derniers présents dans /offres. Donc le nombre de répertoires/fichiers que tu obtiendras avec wc -l sera global, et concernera la totalité du contenu de /offres.
 
Si j'ai bien compris, tu as dans /offres un certains nombres de sous-dossiers qui contiennent x sous-sous-dossiers et y fichiers.
 
Tu devrais obtenir un truc du genre (en bash ou en ksh) :


for affaire in $(find /offres/* -type d -prune)
do
   reps=$(find $affaire -type d | wc -l)
   fics=$(find $affaire -type f | wc -l )
   /usr/bin/echo "$affaire\t$reps\t$fics" >> fichiers_résultats
done


 
Manque plus que la taille, mais je ne sais pas ce que tu veux dire par là : taille de l'ensemble du sous-dossier ?
Si oui, il suffit d'ajouter ceci au code ci-dessus :

taille=$(du -sk $affaire | cut -f1)


 
Et d'afficher $taille ensuite dans ton fichier de résultats.
 

n°1774400
Neenou
Posté le 19-08-2008 à 11:44:38  profilanswer
 

Oui c'est bien ça :)
 
La boucle for ne doit pas être très compliquée mais connaissant bien le langage C,C++ .. j'ai du mal à me faire à la syntaxe de cette boucle for :D
 
Je vais tester ton petit script, merci bcp pour l'aide

n°1776247
Sve@r
Posté le 22-08-2008 à 20:58:49  profilanswer
 

Neenou a écrit :

La boucle for ne doit pas être très compliquée mais connaissant bien le langage C,C++ .. j'ai du mal à me faire à la syntaxe de cette boucle for :D


 
Le principe de la boucle for est de pouvoir traiter un à un une liste d'élément

Code :
  1. for var in hello titi toto
  2. do
  3.     echo "Element [$var]"
  4. done


Va instancier une boucle de 3 itérations et à chaque itération, la variable "var" prendra la valeur "hello", "titi" et "toto".
 
S'il n'y avait que ça, la boucle for n'apporterait que très peu d'avantage. Mais le shell possède d'autres outils et l'un des plus fameux est la délégation => il délègue aux programmes annexes ce qu'il ne sait pas faire lui-même.
Le principe: il est nécessaire que le programme
- existe (mais on peut le créer s'il n'existe pas)
- affiche son résultat à l'écran
Exemple: expr 5 + 1   => affiche le résultat (6) à l'écran
A partir de là, le shell, s'il ne sait pas faire de calcul (comme le Bourne Shell) peut déléguer ce travail à expr. Il lui suffit de mettre l'appel de expr entre backquotes et tout ce que expr affiche sera récupéré ensuite.
Donc, si on veut faire un calcul et récupérer le résultat, on écrit

Code :
  1. var=`expr 5 + 1`     => Le shell fera comme s'il était écrit var=6


ou bien

Code :
  1. var=12
  2. var=`expr $var + 1`    => Le shell fera comme s'il était écrit var=13


Et ce mécanisme (qui n'existe nulle part ailleurs, même pas en C++) permet de tout faire. Si le shell ne sait pas faire une action, ben il délègue l'action à un outil externe et si l'outil n'existe pas ben on le crée (en C++ par exemple). Seule contrainte => l'outil doit afficher son résultat à l'écran
 
Les backquotes étant parfois désagréables, les shells évolués ont introduit une nouvelle notation: $(commande) et donc l'exemple précédent peut de réécrire

Code :
  1. var=12
  2. var=$(expr $var + 1)    => Le shell fera comme s'il était écrit var=13


 
Et donc il est maintenant possible d'associer la boucle for avec ce mécanisme en écrivant

Code :
  1. for var in $(commande quelconque)
  2. do
  3.     ...
  4. done


Le shell commencera par exécuter "commande quelconque" et replacera tout ce qu'elle affiche à la place. Cela donnera donc une boucle de ce style

Code :
  1. for var in <toute une liste de mots affichés par la commande>
  2. do
  3.     ...
  4. done


Et donc chaque mot pourra être traité. C'est ce qui amène à la soluce d'Elmoricq

Code :
  1. for affaire in $(find /offres/* -type d -prune)  
  2. do
  3.     ....
  4. done


La commande "find /offres..." renvoie toute une liste de fichiers et cette liste est ensuite traitée fichier par fichier dans la boucle.
 
Comme quoi, d'une simple boucle for...


Message édité par Sve@r le 22-08-2008 à 20:59:05

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  script: nombre de répertoires,fichiers

 

Sujets relatifs
userscript pour hfr[divers] envois de fichiers en fermeture de session windows.
compter le nombre de ligne d'un fichierScript "Ecrire login + mot de passe et validation sur une page"
copier 2 fichiers txt en un tableau dans un 3ème fichier avec c++Attaquer des fichiers Btrieve (*.btr) : comment ?
Créer un handler pour le chargement de fichiersVérifier présence fichier dans 1 répertoire
grace a un lien telecharger des fichiers se trouvant dans une bdgrace a un lien telecharger des fichiers se trouvant dans une db
Plus de sujets relatifs à : script: nombre de répertoires,fichiers


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR