IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[aide script shell] renommage de repertoire / sous repertoire / fichier


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 9
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    cd mon repertoire
    for file in * ;do
    mv -T "$file" ${file// /_}
    done
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cd mon repertoire
    ls -1 * | xargs rename 's/ /_/g' *
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 20
    Par défaut
    il existe la commande ls -R <nom_du répertoire>, mais je ne sais pas qi cela te conviendra par la suite.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 9
    Par défaut
    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...

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 703
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 703
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find rep/ -type f -exec rename 's/ /_/g' {} \;

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 9
    Par défaut
    merci mais idem ne modifie que les fichiers dans le rep initial , les fichiers contenu dans les sous rep ne sont pas impactés...

  6. #6
    Invité
    Invité(e)
    Par défaut
    Salut,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     -depth Process each directory's contents before the directory itself.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 9
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 703
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 703
    Par défaut
    essaie avec ce script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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')

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 9
    Par défaut
    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

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 703
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 703
    Par défaut
    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 9
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  12. #12
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 703
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 703
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 9
    Par défaut
    encore un grand merci a toi pour ton aide précieuse

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. besoin d'aide pour un script shell extrayant les données d'un fichier texte ou un fichier log
    Par haithem20080 dans le forum Applications et environnements graphiques
    Réponses: 7
    Dernier message: 15/03/2010, 15h10
  2. Lister les sous repertoires et les fichiers d'un dossier
    Par benito9253 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 03/08/2009, 21h49
  3. aide script shell
    Par ach152 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 10/06/2008, 22h14
  4. Aide script shell unix, creation utilisateur
    Par jazzparadise dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 24/05/2007, 13h25
  5. Script shell pour tester si un répertoire est vide ou pas
    Par Ito dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 04/10/2006, 18h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo