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 11/07/2011, 15h19   #1
Invité de passage
 
Cyril RICHARD
Inscription : octobre 2009
Messages : 8
Détails du profil
Informations personnelles :
Nom : Cyril RICHARD

Informations forums :
Inscription : octobre 2009
Messages : 8
Points : 1
Points : 1
Par défaut Script SHELL répertoires et sous-répertoires

Bonjour,

J'aurai besoin de vos lumières,
Je doit faire un script qui vérifie dans chaque répertoire de mon arborescence si il y a un nom de fichier et son équivalent en .gz
S'il trouve son équivalent en .gz alors on supprime le .gz

Et cela doit être fait dans toute l'arborescence de mon point de montage.

Voici le script que j'ai réalisé pour le moment

Mon problème est que je ne trouve pas comment faire pour que le script parcours tous les sous répertoires. J'ai testé avec "for i in `ls -R`" mais ca ne fonctionne pas.

Merci de votre aide

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
 
for i in `ls -R`
do
  LISTE_FICHIER=`ls`
  for FICHIER in $LISTE_FICHIER
  do
      CHERCHE=$( find . -name $FICHIER.gz )
      if [  $CHERCHE ]
      then
      rm -f $FICHIER.gz
      fi
  done
done
richardcy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/07/2011, 19h45   #2
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 3 055
Points : 4 934
Points : 4 934
Citation:
Envoyé par richardcy Voir le message
Bonjour,

J'aurai besoin de vos lumières,
Je doit faire un script qui vérifie dans chaque répertoire de mon arborescence si il y a un nom de fichier et son équivalent en .gz
S'il trouve son équivalent en .gz alors on supprime le .gz

Et cela doit être fait dans toute l'arborescence de mon point de montage.

Voici le script que j'ai réalisé pour le moment

Mon problème est que je ne trouve pas comment faire pour que le script parcours tous les sous répertoires. J'ai testé avec "for i in `ls -R`" mais ca ne fonctionne pas.

Merci de votre aide

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
 
for i in `ls -R`
do
  LISTE_FICHIER=`ls`
  for FICHIER in $LISTE_FICHIER
  do
      CHERCHE=$( find . -name $FICHIER.gz )
      if [  $CHERCHE ]
      then
      rm -f $FICHIER.gz
      fi
  done
done
Code bash :
1
2
3
4
5
find rep -type f -name "*.gz" -print |while read file
do
    verif=`echo "$file" |sed -e "s/\.gz\$//"`
    test -f "$verif" && rm -f "$file"
done
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/07/2011, 10h17   #3
Invité de passage
 
Cyril RICHARD
Inscription : octobre 2009
Messages : 8
Détails du profil
Informations personnelles :
Nom : Cyril RICHARD

Informations forums :
Inscription : octobre 2009
Messages : 8
Points : 1
Points : 1
Impeccable ça fonctionne

Merci beaucoup
richardcy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2011, 14h05   #4
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Citation:
Envoyé par Sve@r Voir le message
Code bash :
1
2
3
4
5
find rep -type f -name "*.gz" -print |while read file
do
    verif=`echo "$file" |sed -e "s/\.gz\$//"`
    test -f "$verif" && rm -f "$file"
done


Code :
1
2
3
4
5
6
#!/bin/bash
 
shopt -s globstar
for file in rep/**/*.gz; do
    [ -f "${file%.gz}" ] && rm "$file"
done
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 16/07/2011, 18h37   #5
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 3 055
Points : 4 934
Points : 4 934
Citation:
Envoyé par FRUiT Voir le message
Code :
for file in rep/**/*.gz; do
Ouais. J'apprécie l'utilisation du % que j'ai bêtement raté (faudra que je me force un peu à utiliser cette possibilité) mais dans ta forme de traitement à base de for, si un fichier (ou un répertoire) contient un espace dans son nom => gros crash !!!
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/07/2011, 21h17   #6
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
Citation:
Envoyé par Sve@r
dans ta forme de traitement à base de for, si un fichier (ou un répertoire) contient un espace dans son nom => gros crash !!!
normalement, non, ça ne devrait pas poser de problème :
Code :
1
2
3
4
5
touch 'my file' my$'\n'file
for f in ./*; do echo "| $f |"; done
| ./my
file |
| ./my file |
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 16/07/2011, 23h13   #7
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Citation:
Envoyé par Sve@r Voir le message
Ouais. J'apprécie l'utilisation du % que j'ai bêtement raté (faudra que je me force un peu à utiliser cette possibilité) mais dans ta forme de traitement à base de for, si un fichier (ou un répertoire) contient un espace dans son nom => gros crash !!!
C'est dans la forme « for in $(ls) » que les espaces posent effectivement problème.

Ici ce n'est pas le cas.
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/07/2011, 12h36   #8
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 3 055
Points : 4 934
Points : 4 934
Citation:
Envoyé par FRUiT Voir le message
C'est dans la forme « for in $(ls) » que les espaces posent effectivement problème.

Ici ce n'est pas le cas.
Effectivement, je viens de le vérifier. Mais j'aimerais bien comprendre pourquoi...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2011, 14h05   #9
Responsable Modération
 
Avatar de ok.Idriss
 
Homme Idriss Neumann
Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)
Inscription : février 2009
Messages : 1 982
Détails du profil
Informations personnelles :
Nom : Homme Idriss Neumann
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Consultant en SSII et étudiant au CNAM Paris (ingénieur SI)

Informations forums :
Inscription : février 2009
Messages : 1 982
Points : 6 101
Points : 6 101
Bonjour.

Citation:
Envoyé par Sve@r Voir le message
Effectivement, je viens de le vérifier. Mais j'aimerais bien comprendre pourquoi...
Dans un cas on parcourt la sortie brut d'une commande (mot par mot) sans faire attention aux noms composés (avec ls), dans l'autre l'index parcourt l'ensemble des fichiers du répertoire courant (avec *).

Cordialement,
Idriss
ok.Idriss est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/07/2011, 15h35   #10
Membre éclairé
 
Avatar de FRUiT
 
Homme
Inscription : février 2011
Messages : 83
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : février 2011
Messages : 83
Points : 326
Points : 326
Z'actement !
__________________
Neon Suite by FRUiT (kde4.6) http://tinyurl.com/yzm7cee
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
FRUiT est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2011, 17h58   #11
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 3 055
Points : 4 934
Points : 4 934
Citation:
Envoyé par ok.Idriss Voir le message
Bonjour.



Dans un cas on parcourt la sortie brut d'une commande (mot par mot) sans faire attention aux noms composés (avec ls), dans l'autre l'index parcourt l'ensemble des fichiers du répertoire courant (avec *).

Cordialement,
Idriss
Mouais. Tu as bien redécrit le comportement mais toutefois sans vraiment l'expliquer. Dans 99% des cas (for i in liste_de_mot; for i in $(commande); for i in $variable) le for va traiter ce qu'il y a après le "in" mot par mot en se calant sur l'IFS pour séparer les mots.
Mais pourquoi ne fait-il pas de même dans le cas * ? Est-ce que c'est parce que ce métacaractère est destiné à identifier un nom de fichier que le shell fait travailler le for différemment ? Accessoirement ça marche aussi sur d'autres métacaractères comme ? et [] et c'est aussi valable en ksh...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/07/2011, 19h06   #12
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
Bonjour,

quand on utilise set -x; echo ./*, on voit que le shell met les noms des fichiers entre guillemets simples.

ce serait comme faire for i in 'foo' 'bar baz'; do echo "$i"; done
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 17/07/2011, 22h46   #13
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 3 055
Points : 4 934
Points : 4 934
Citation:
Envoyé par N_BaH Voir le message
Bonjour,

quand on utilise set -x
Bien vu. J'ai essayé de voir la différence entre "ls" et "echo *" en faisant ls |od -x et echo * |od -x mais j'ai pas pensé au set -x. Je dois trop faire du Python et j'ai perdu tous mes réflexes shell
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r 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 23h51.


 
 
 
 
Partenaires

Hébergement Web