Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/10/2011, 17h11   #1
Candidat au titre de Membre du Club
 
Inscription : octobre 2011
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 23
Points : 10
Points : 10
Par défaut Calcul espace disque de fichier spécifique (après find)

Je dois réaliser un script me permettant de compter le nombre de sous dossiers et de fichiers à l'intérieur d'un même dossier et afficher ensuite leur taille (uniquement pour les fichiers).

Pour ce qui est du comptage des sous-dossiers et fichiers j'y suis parvenu, mais je n'arrive pas a afficher correctement l'espace disque occupé.

Je vais essayer de simplifier pour que ce soit plus clair:

J'ai un dossier "/var/www/http/xxx" contenant un sous répertoire "/var/www/http/xxx/yyy" et plusieurs fichiers:

-test.java
-test.php
-test.mp3

Le sous répertoire "/var/www/http/xxx/yyy" contient lui même :
-test2.php
-test2.mp3

Je recherche uniquement les fichiers n’étant pas .php ou .java.

Je fais donc un find /var/www/http/xxx -type f ! -iname "*.php" -a ! -iname "*.java" qui me renvoie comme résultat :

/var/www/http/xxx/test.mp3
/var/www/http/xxx/yyy/test2.mp3
Ce que je voudrais c'est connaitre l'espace disque utilisé par ces deux fichiers et UNIQUEMENT ces deux fichiers.

J'ai essayé de décomposer en 2 parties : une première variable contenant les noms des fichiers correspondant à ma recherche (variable1=`find /var/www/http/xxx -type f ! -iname "*.php" -a ! -iname "*.java"`)

Puis un du -bch sur cette précédente variable, cela marche mais uniquement lorsque ma recherche a retourné un résultat, si aucun fichier correspondant à mes critères n'est trouvé, cela exécute un du -bch sur le dossier dans lequel je me trouve (ce qui ne m’intéresse pas du tout).

On m'a parlé de l'option -exec à placer dans la commande find mais je ne trouve cependant pas la bonne syntaxe.

J’espère que vous pourrez m'aider.

Je vous en remercie d'avance.
Chochal est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/10/2011, 17h17   #2
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 538
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 538
Points : 7 754
Points : 7 754
Code :
find /var/www/http/xxx -type f ! -iname "*.php" -a ! -iname "*.java" | xargs ls -l | awk '{print $5}'
tu y étais presque pourquoi tu t'es arreté là .... ce que tu cherchais c'était juste le "| xargs autrecommande"
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/10/2011, 17h22   #3
Membre habitué
 
Avatar de Levi59
 
Homme
Étudiant
Inscription : août 2011
Messages : 46
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2011
Messages : 46
Points : 126
Points : 126
Tu as essayé un :
Code :
1
2
3
4
while read
do
    echo $REPLY
done < <(find ...)
à chaque tour de la boucle, $REPLY contient un chemin de fichier. Si il n'y a pas de fichier, il ne devrait rien se passer.
__________________
Carpe Diem
Levi59 est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 24/10/2011, 17h24   #4
Candidat au titre de Membre du Club
 
Inscription : octobre 2011
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 23
Points : 10
Points : 10
Lorsque j’exécute ta commande, j'obtiens un résultat du type :

4096
4096
4096
4096

Pourrais-tu me la décomposer et me la détailler pour que je puisse l'adapter à mes besoins ?

PS: J'ai oublié de préciser que le résultat doit être l'addition des tailles de tous les fichiers correspondants

Merci
Chochal est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/10/2011, 17h33   #5
Candidat au titre de Membre du Club
 
Inscription : octobre 2011
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 23
Points : 10
Points : 10
Pour frp31:

Cela ne semble pas correpondre a mes attentes, en effet la commande :
Code :
find /var/www/http/xxx -type f ! -iname "*.php" -a ! -iname "*.java" | xargs ls -l
me donne exactement le meme resultat qu'un
Chochal est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/10/2011, 17h41   #6
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Code :
find /var/www/http/xxx -type f ! -iname "*.php" -a ! -iname "*.java" -exec du {} \; | awk '{ SUM += $1} END { print SUM }'
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est actuellement connecté   Envoyer un message privé Réponse avec citation 30
Vieux 24/10/2011, 17h56   #7
Candidat au titre de Membre du Club
 
Inscription : octobre 2011
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 23
Points : 10
Points : 10
Un grand merci à toi zipe31.

Cependant est ce possible d'afficher le resultat avec l'unité (k, m, g)
comme le ferait l'option -h de la commande du ?
Chochal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2011, 19h03   #8
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Bonjour,

Code BASH :
1
2
sizes=( $(find /var/www/http/xxx -type f ! -iname "*.php" -a ! -iname "*.java" -printf "%s\n") )
(( sizes )) && (IFS=+; printf '%d octets\n' $(( ${sizes[*]} )) )
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 40
Vieux 25/10/2011, 09h05   #9
Candidat au titre de Membre du Club
 
Inscription : octobre 2011
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 23
Points : 10
Points : 10
Merci N_BaH.

Mais n'est ce pas possible d'afficher le resultat de la commande dans un format plus lisible ? de type 1Go au lieu de 1 073 741 824 octets ?.
Chochal est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 25/10/2011, 15h20   #10
Membre actif
 
Homme
Inscription : août 2011
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : août 2011
Messages : 44
Points : 153
Points : 153
Bonjour,

si tu as la commande stat et bash >=4 :
Code :
1
2
3
 
size=$(( $(shopt -s globstar extglob; stat -c '+%s' /var/www/http/xxx/**/!(*.php|*.java)) ))
awk ' { printf "%.10f Gb\n", $1/(1024*1024*1024) } ' <<< ${size}
chardclo est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 25/10/2011, 15h26   #11
Candidat au titre de Membre du Club
 
Inscription : octobre 2011
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 23
Points : 10
Points : 10
Merci, je vais tester ca.
Chochal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/10/2011, 15h42   #12
Candidat au titre de Membre du Club
 
Inscription : octobre 2011
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 23
Points : 10
Points : 10
Il me semble qu'il manque une parenthese quelque part, je la rajoute ou?
Chochal est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/10/2011, 16h07   #13
Membre actif
 
Homme
Inscription : août 2011
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : août 2011
Messages : 44
Points : 153
Points : 153
c'est corrigé.
chardclo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/10/2011, 16h18   #14
Candidat au titre de Membre du Club
 
Inscription : octobre 2011
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 23
Points : 10
Points : 10
J'obtiens ce message d'erreur

./taille2: command substitution: line 3: syntax error near unexpected token `('
./taille2: command substitution: line 3: `shopt -s globstar extglob; stat -c '+%s' /var/java/dev2/**/!(*.php|*.java)'


Merci de ton aide.
Chochal est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/10/2011, 21h49   #15
Membre actif
 
Homme
Inscription : août 2011
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : août 2011
Messages : 44
Points : 153
Points : 153
Citation:
Envoyé par Chochal Voir le message
J'obtiens ce message d'erreur

./taille2: command substitution: line 3: syntax error near unexpected token `('
./taille2: command substitution: line 3: `shopt -s globstar extglob; stat -c '+%s' /var/java/dev2/**/!(*.php|*.java)'


Merci de ton aide.

arg, désolé ... je suis allé un peu vite en besogne
l'option extglob n'est pas considérée active au moment de la lecture de la ligne et cela génère donc cette erreur de syntaxe. Il faut donc sortir l'activation de l'option :
Code :
1
2
3
shopt -s globstar extglob
size=$(( $(stat -c '+%s' /var/www/http/**/!(*.php|*.java) 2>/dev/null) ))
awk ' { printf "%.10f Gb\n", $1/(1024*1024*1024) } ' <<< ${size}
chardclo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/10/2011, 09h33   #16
Candidat au titre de Membre du Club
 
Inscription : octobre 2011
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 23
Points : 10
Points : 10
J'ai encore un message d'erreur.

bash: ./taille2: /bin/bash^M: bad interpreter: Aucun fichier ou répertoire de ce type

Merci pour ton aide.
Chochal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 09h55   #17
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Bonjour,

ouaip, ça c'est parce que tu as écrit ton script sur Windows, il faut le convertir au format UNIX.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 10h13   #18
Candidat au titre de Membre du Club
 
Inscription : octobre 2011
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 23
Points : 10
Points : 10
Merci beaucoup,

cela semble fonctionner mais j''obtiens tout de meme un message d'erreur:

./taille2: line 3: shopt: globstar: invalid shell option name

0.0003870251 Gb

Merci
Chochal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 10h16   #19
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
t'es pas en BASH >=4 ?
dans un terminal, que répond echo $BASH_VERSION ?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/10/2011, 10h51   #20
Candidat au titre de Membre du Club
 
Inscription : octobre 2011
Messages : 23
Détails du profil
Informations forums :
Inscription : octobre 2011
Messages : 23
Points : 10
Points : 10
Ceci:

3.2.39(1)-release
Chochal est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h02.


 
 
 
 
Partenaires

Hébergement Web