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 04/01/2011, 15h16   #1
Invité de passage
 
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 1
Points : 1
Par défaut [aide script shell] renommage de repertoire / sous repertoire / fichier

bonjour,

je m'inscrit sur votre forum car je n'arrive pas a résoudre pour prb. je suis débutant en shell et je coince pour créér un petit script me permettant de déplacer tous les fichiers vidéo stocke dans un répertoire ou sous répertoire vers un autre emplacement.

le déplacement me pose prb lorsque les répertoires ou sous répertoire ou fichiers contiennent un ou plusieurs espaces dans leur nom.

donc au début de mon script il faudrait que je remplace tous les espaces par des _.

Code :
1
2
3
4
cd mon repertoire
for file in * ;do
mv -T "$file" ${file// /_}
done
ou

Code :
1
2
cd mon repertoire
rename 's/ /_/g' *
le renommage se fait bien sur les répertoires ou nom de fichiers. mais je souhaiterai donc que cela s'applique egalement aux sous répertoires (et fichiers contenu dans ces sous rep)

j'ai essaye:

Code :
1
2
cd mon repertoire
ls -1 * | xargs rename 's/ /_/g' *
Code :
1
2
cd mon repertoire
find * | xargs rename 's/ /_/g' *
mais ne fonctionne pas...

auriez une petite idee afin de réaliser le renommage sur l'ensemble du répertoire et sous répertoire ?

merci d'avance pour votre aide
Smoki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 15h31   #2
Invité régulier
 
Inscription : décembre 2010
Messages : 20
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 20
Points : 9
Points : 9
il existe la commande ls -R <nom_du répertoire>, mais je ne sais pas qi cela te conviendra par la suite.
arso91 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 16h02   #3
Invité de passage
 
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 1
Points : 1
je ne connaissais pas cette option (--recursive ) mais me donne le même résultat que ls * ou find * . afficher les sous rep et fichier pas de soucis mais exécuter une commande dessus c'est la que je coince...
Smoki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/01/2011, 21h42   #4
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 065
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 065
Points : 4 126
Points : 4 126
Code :
find rep/ -type f -exec rename 's/ /_/g' {} \;
N_BaH est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/01/2011, 12h16   #5
Invité de passage
 
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 1
Points : 1
merci mais idem ne modifie que les fichiers dans le rep initial , les fichiers contenu dans les sous rep ne sont pas impactés...
Smoki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 12h22   #6
Expert Confirmé Sénior
 
Homme Laurent Willems
Expert Stop/Start
Inscription : septembre 2002
Messages : 2 544
Détails du profil
Informations personnelles :
Nom : Homme Laurent Willems
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Expert Stop/Start

Informations forums :
Inscription : septembre 2002
Messages : 2 544
Points : 4 249
Points : 4 249
Salut,

et en ajoutant l'option suivante à find, ça donne quoi?

Code :
1
2
 
 -depth Process each directory's contents before the directory itself.
__________________
Alea Jacta Test!
Mygale1978 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 12h47   #7
Invité de passage
 
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 1
Points : 1
alors en fait si cela fonctionne si j'utilise la commande autant de fois qu'il y à de sous répertoires !

à la première exécution j'ai des messages du type:

Code :
1
2
3
4
find: "/home/cyril/downloads/complete/test 1": Aucun fichier ou dossier de ce type
find: "/home/cyril/downloads/complete/test  2": Aucun fichier ou dossier de ce type
find: "/home/cyril/downloads/complete/test    4 a": Aucun fichier ou dossier de ce type
find: "/home/cyril/downloads/complete/test   3": Aucun fichier ou dossier de ce type
à la deuxième exécution:

Code :
find: "/home/cyril/downloads/complete/test___3/test   4": Aucun fichier ou dossier de ce type
à la troisieme tous les rep et sous rep sont renommés ...

apres j'utilise la même commande pour les fichiers et la cela fonctionne partout car il n'y a plus d'espace dans les noms de rep ^^


si j'ajoute l'option -depth >> idem oblige de le faire le nombre de fois le nombre de sous répertoire avec une erreur un peu différente:

Code :
Can't rename /home/cyril/downloads/complete/test 2/sous rep /home/cyril/downloads/complete/test_2/sous_rep: Aucun fichier ou dossier de ce type
bon vous me direz il suffit de lancer plusieurs fois la commande et tant pis pour les erreurs de retour qui ne seront pas visibles lors de l'exécution du script en mode graphique

merci a vous pour votre aide
Smoki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 14h20   #8
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 065
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 065
Points : 4 126
Points : 4 126
essaie avec ce script :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
 
ren(){
   [[ $1 == *\ * ]] && mv "$1" "${1// /_}"
}
recurs(){
   for file in "$1"/*
   do [ -d "$file" ] && { ren "$file"; recurs "${file// /_}"; }
      [ -f "$file" ] && ren "$file"
   done
}
 
set -x
recurs "$1"
set -x nous renseignera sur des noms de fichiers affichant un ou plusieurs espace qui ne serait pas reconnu comme tel (genre : $'\302\240')
N_BaH est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/01/2011, 15h23   #9
Invité de passage
 
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 1
Points : 1
alors la chapeau cela fonctionne mais cela fonctionne même trop bien ^^

j'ai mis ton code dans un fichier test.sh que j'exécute dans le répertoire qui m'intéresse .

tout est renomme nickel sauf que le script ne s'arrête plus ! ( j'ai ajouter un exit 0 a la fin)

le processus m'utilise 100% du proce et encore mieux quand je me déplace dans d'autre rep il me renomme tous également (je ne pense pas qu'il y ai des rep avec espace sous ubuntu mais heureusement que je suis pas retourne jusqu'a la racine system)

oblige de kill le processus test.sh manuellement.

par contre etant débutant j'avoue ne plus rien comprendre au script aurait tu l'amabilité de me l'expliquer un peu ?

pourquoi deux crochets pour: [[ $1 == *\ * ]]

set -x ?????
recurs "$1" ??

grand merci a toi
Smoki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 16h00   #10
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 065
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 065
Points : 4 126
Points : 4 126
Ah, la boulette ! Désolé, j'ai été trop léger sur les tests : il faut spécifier un répertoire en argument lorsque tu lances le script
Citation:
mais heureusement que je suis pas retourne jusqu'a la racine system
probablement que si, car si $1 n'existe pas, alors $1/*, c'est /*

remplace :
Code :
1
2
<s>recurs "$1"</s>
recurs "${1:-.}"
ainsi, si tu ne donnes pas de répertoire en argument, le répertoire courant sera utilisé. Ou alors on fait un test plus complet :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
[ -z "$1" ] && {
   echo "il faut donner un nom de répertoire"
   exit 1
} || {
   [ -d "$1" ] && {
      startDir="$1"
   } || {
      echo "il faut donner un nom de répertoire"
      exit 2
   }
}
set -x
recurs "$startDir"
les double-crochets permettent des évaluations plus fines que les crochets simples, l'utilisation des motifs génériques du développement des chemins (avec ==, et !=), l'utilisation de regex avec =~

set -x affiche les commandes et leurs arguments quand elles sont exécutées
N_BaH est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/01/2011, 17h19   #11
Invité de passage
 
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 1
Points : 1
si je souhaite ne pas utiliser d'argument au lancement est ce que c'est bon si j'écris cela ?? (désole mais y a trop de variables je comprend plus rien)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Cheminsource=mon chemin
 
rename(){
        [[ $Cheminsource == *\ * ]] && mv "$Cheminsource" "${Cheminsource// /_}"
        }
 
recurs(){
        for file in "$Cheminsource"/*;
        do [ -d "$file" ] && { rename "$file"; recurs "${file// /_}"; }
        [ -f "$file" ] && rename "$file"
        done
        }
 
set -x
recurs
Smoki est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 17h49   #12
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 065
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 065
Points : 4 126
Points : 4 126
non, les fonctions rename et recurs ne doivent pas changer, elles travaillent toujours sur le premier argument qui leur est donné ( => $1);
par contre tu appelleras recurs ainsi :les fonctions utilisent des paramètres positionnels, comme les scripts;
pour exemple, regarde cette fonction simple :
Code :
1
2
3
4
5
6
7
8
9
monShift() {
   echo "$1" #affiche le premier paramètre positionnel
   shift     #passe au paramètre positionnel suivant
   [ -n "$1" ] && monShift "$@" #s'il y a encore un paramètre positionnel, alors exécuter la fonction avec les paramètres positionnels restants.
}
monShift foo bar baz
foo
bar
baz
N_BaH est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/01/2011, 17h58   #13
Invité de passage
 
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 1
Points : 1
encore un grand merci a toi pour ton aide précieuse
Smoki 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 13h53.


 
 
 
 
Partenaires

Hébergement Web