Commande Linux

Forum d'assistance et d'échange sur l'installation, la configuration, et l'utilisation des système Linux et BSD. Vous pouvez y poster vos questions concernant ces systèmes d'exploitation en faisant l'effort préalable de rechercher dans le forum, dans les manuels et les documentations que la réponse n'y figure pas.

Modérateur: modos Ixus

Commande Linux

Messagepar Diablo_22 » 17 Fév 2005 03:12

Bonjour, voila j'aimerai savoir comment faire ceci en script shell #!/bin/sh

Analyser le contenu d'un repertoire sur un seul niveau
créer un enregistrement pour chaque répertoires et/ou fichiers
rencontrés

L'enregistrement de type répertoire et de la forme suivant:
R Nom du répertoire nombres d'entrées
L'enregistrement du type fichier a la forme suivant:
F Nom du fichier Nombre de ligne trouvé dans le fichier

Merci pour votre aide :)
Diablo_22
Quartier Maître
Quartier Maître
 
Messages: 15
Inscrit le: 05 Jan 2005 23:28

Messagepar Muzo » 17 Fév 2005 10:23

Salut,

Ca ne serait pas encore une colle pour ton BTS ou ton stage toi?
/Muzo
"La vie n'est pas un combat, mais une passion à défendre!" MASS HYSTERIA - Knowledge is power
Avatar de l’utilisateur
Muzo
Amiral
Amiral
 
Messages: 5236
Inscrit le: 07 Mai 2003 00:00
Localisation: BNF! Je me culturise.

Messagepar Jacques- » 17 Fév 2005 11:32

Si j'ai bien compris, il s'agit de retranscrire une partie du résultat de la commande ls -l (le chiffre après les droits des fichiers donne le nombre de liens vers un répertoire) et de compter les lignes dans les fichiers.
En gros, faire une boucle du style :
Code: Tout sélectionner
for Info in `ls -l` ; do 
  # On récupère le nom du fichier (9ème champ)
  Valeur=`echo $Info | awk '{print $9}'`
  # On teste le type de fichier
  if [ -f $Valeur ] ; then
     # On compte le nombre de ligne avec wc et on ajoute l'info au fichier
     echo "F $Valeur `wc -l $Valeur`" >> /tmp/Sortie_Fichiers
  elif [ -d $Valeur ] ; then
     # Si c'est un répertoire, on donne le nombre de lien (2ème champ)
     echo "R $Valeur `echo $Info | awk '{print $2}'`" >> /tmp/Sortie_Repertoires
  fi
done


A tester et à améliorer.
awk peut aussi donner le nombre réel de liens il suffit de retirer 2 par exemple à chaque info de répertoire pour ne pas compter les répertoires . (le répertoire courant) et .. (le répertoire supérieur).

Jacques
Avatar de l’utilisateur
Jacques-
Vice-Amiral
Vice-Amiral
 
Messages: 952
Inscrit le: 23 Jan 2003 01:00

Messagepar Diablo_22 » 17 Fév 2005 20:59

je te remercie je teste et je te tien o courant. Et oui c'est un colle pour mon bts :lol: mais t'inkiete avant sa y avait autre chose c'est juste que je bloqué a ce niveau la. :wink: . Et encore merci car sur un autre forum de developpeur que je ne citerai pas on m'a carrement banni car ma question était mal posé :evil: soit disant mais bon.... 8)
Diablo_22
Quartier Maître
Quartier Maître
 
Messages: 15
Inscrit le: 05 Jan 2005 23:28

Messagepar Jacques- » 17 Fév 2005 21:16

On ne peut pas dire qu'elle était très claire, mais chercher un peu dans le man ne fait pas de mal.
Pour lister, ls, pour analyser le tout, une boucle for, et pour extraire le nombre de ligne ou un champ précis on peut utiliser awk (il sait très bien compter aussi).

Jacques
Avatar de l’utilisateur
Jacques-
Vice-Amiral
Vice-Amiral
 
Messages: 952
Inscrit le: 23 Jan 2003 01:00

Messagepar Diablo_22 » 17 Fév 2005 22:17

arf un erreur sur cette ligne
Code: Tout sélectionner
Valeur=`echo $Info | awk '{print $9}'`

}:command not found
Diablo_22
Quartier Maître
Quartier Maître
 
Messages: 15
Inscrit le: 05 Jan 2005 23:28

Messagepar Jacques- » 17 Fév 2005 22:50

A priori la ligne est correcte, vérifie bien les cotes, il y en a des inverses à chaque extrémité (Alt-Gr 7) pour récupérer le résultat, et des simples pour encadrer l'action dans awk '{ print $9}'.

La moindre erreur de caractère entre une simple ', une double " et une inverse ` et le shell n'est pas d'accord. L'erreur peut d'ailleurs avoir eu lieu bien plus haut dans un script (ça m'est arrivé sur un script de près de 10 000 lignes, avec une erreur environ 2000 lignes plus haut. Pas marrant à trouver, vive les éditeurs à coloration syntaxique (sous linux tu as kate, vim, emacs entre autre).

Jacques
Avatar de l’utilisateur
Jacques-
Vice-Amiral
Vice-Amiral
 
Messages: 952
Inscrit le: 23 Jan 2003 01:00

Messagepar Diablo_22 » 19 Fév 2005 19:59

Voila après quelques modif voici mon script en entier et encore merci pour l'aide apporté
:wink:

Code: Tout sélectionner
#!/bin/sh

echo "Nom du répertoire à analyser"
#Lecture de l'entrée pendant l'execution du script
read rep

if [ ! -d $rep ] ; then
echo "Répertoire $rep inexistant"
exit 1;
fi

echo "Donner un nom de fichier ou seront stockés les données"
#Lecture de l'entrée pendant l'execution du script
read ficher

if [ ! $fichier ] ; then
echo "Le fichier par défaut sera Test.txt"
#Création du fichier par défaut
touch Test.txt
#initialisation de la variable avec le nom de fichier par défaut
fichier="Test.txt"
else [ $fichier ]
echo "Le fichier de donnée est: $fichier"
#Création du fichier
touch $fichier
fi

#On se place sous le répertoire qui va être analyser
cd $rep

############
# Partie 1 #
############

#initialisation des variables
i=0
valeur=0
#On regarde si le répertoire contient des entrées
for i in `ls`
do
   valeur=$((valeur+1))
done

#Si le répertoire est vide on quitte le script
if [ $valeur == 0 ] ; then
echo "Le répertoire $rep est vide"
exit 1
fi
#On affiche le nombre d'entrées contenu dans le répertoire
echo "$valeur fichier dans le répertoire $rep"

for Info in `ls`
do
   #On récupère le nom du fichier/répertoire
   Valeur=ècho $Info | awk '{print $1}'`
   #Si on est en présence d'un fichier on compte le nombre de ligne avec sed et on ajoute l'info au fichier de données
   if [ -f $Valeur ] ; then
      echo "F $Valeur `sed -n \$=$Valeur`" >> ../$fichier
   #Si c'est un répertoire on donne le nombre d'entrées
   elif [ -d $Valeur ] ; then
      #initialisation des variables
      j=0
      entree=0
      for j in `ls -l $Valeur`
      do
         entree=$((entree+1))
      done
      echo "R $Valeur $entree" >> ../$fichier
   fi
done

############
# Partie 2 #
############

######################################################################################################################
# On affiche les données contenus dans le fichier d'information et on test ligne par ligne pour voir si on a affaire #
# A un fichier ou répertoire. Et on affiche les informations à la console                        #             #
######################################################################################################################

#Pour les fichiers
awk '{if($1=="F") {printf ("%-30s %-15s %-6s ligne(s)\n",$2,"Fichier",$3);}}'<../$fichier
#Pour les répertoires
awk '{if($1=="R") {printf ("%-30s %-15s %-6s entrée(s)\n",$2,"Répertoire",$3);}}'<../$fichier
Diablo_22
Quartier Maître
Quartier Maître
 
Messages: 15
Inscrit le: 05 Jan 2005 23:28


Retour vers Linux et BSD (forum généraliste)

Qui est en ligne ?

Utilisateur(s) parcourant actuellement ce forum : Aucun utilisateur inscrit et 1 invité