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 :

Renommer liste de fichiers selon nom du répertoire avec incrémentation


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2005
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 105
    Par défaut Renommer liste de fichiers selon nom du répertoire avec incrémentation
    Bonjour,
    je bloque sur un script qui me permettrait de parcourir l'ensemble des répertoires à partir du répertoire parent, et de renommer l'ensemble des images selon nomdureperoirecourant-incrementation.jpg

    Ex:
    dans folder1 les fichiers seraient renommer:
    folder1-1.jpg
    folder1-2.jpg
    folder1-3.jpg
    ....


    J'arrive déjà à renommer l'ensemble des images en les incrémentant mais impossible d'y ajouter le nom du dossier.

    Pour le moment mon code est:
    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
    folders=$(find -type d)
    for dir in $folders; do
    DIR=$dir
    echo $DIR
    declare -i i; i=0;
    for file in $DIR/*.jpg; 
     do
     i=`expr $i+1`
     mv "$file" $DIR/$i.jpg
     done
    echo "Finished renaming file."
    done
    echo "Finished batching."
    Si j'utilise $DIR-$i.jpg, j'ai une erreur car $DIR=./folder1
    en soit il faudrait que je soit en mesure de supprimer ./

    Cette méthode est utile car elle ne bloque pas avec les espaces.

    ps: si j'avais la possibilité en plus de renommer les photos peut importe l'extension (jpg|png|gif) et la cerise sur le gateau serait de pouvoir incrementer selon l'ordre alphabétique des fichiers
    ex: folder a
    filea.jpg -> folder1-2.jpg
    fileb.jpg -> folder1-2.jpg

    Merci d'avance.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 12 867
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par thibaut06 Voir le message
    Si j'utilise $DIR-$i.jpg, j'ai une erreur car $DIR=./folder1
    en soit il faudrait que je soit en mesure de supprimer ./
    Salut

    basename "$DIR" te donnera "folder1" (les conventions veulent que les noms de variables persos soient écris en minuscules pour éviter d'aller écraser des variables système comme HOME ou PATH)

    Citation Envoyé par thibaut06 Voir le message
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for file in $DIR/*.jpg; 
     do
     i=`expr $i+1`
     mv "$file" $DIR/$i.jpg
     done
    Cette méthode est utile car elle ne bloque pas avec les espaces.
    Hum, étant donné que le for se cale sur l'espace pour travailler, si tu as un fichier style "ma maison.jpg" ben ton for traitera d'abord "ma" puis ensuite "maison.jpg" donc bien que ça ne "bloque" pas à proprement parler, le résultat du traitement sera quand-même...

    Citation Envoyé par thibaut06 Voir le message
    ps: si j'avais la possibilité en plus de renommer les photos peut importe l'extension (jpg|png|gif) et la cerise sur le gateau serait de pouvoir incrementer selon l'ordre alphabétique des fichiers
    ex: folder a
    filea.jpg -> folder1-2.jpg
    fileb.jpg -> folder1-2.jpg
    Hum, il est impossible d'avoir 2 fichiers de même nom dans un même répertoire. Et puis je ne vois pas trop le lien entre "a" et "1". Bon bref...
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    i=0
    ls folder | while read f
    do
        i=`expr $i + 1`
        extension=`echo "$f" |cut -f2- -d\.`
        mv "folder/$f" "folder/folder-$i.$extension"
    done
    Et là, en plus, étant donné que le read ne s'occupe absolument pas de l'espace, même un fichier avec un espace dans son nom sera correctement traité...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 690
    Par défaut
    Bonjour,

    Citation Envoyé par sve@r
    si tu as un fichier style "ma maison.jpg" ben ton for traitera d'abord "ma" puis ensuite "maison.jpg" donc bien que ça ne "bloque" pas à proprement parler, le résultat du traitement sera quand-même...
    oulala ! non ! le shell gère ça très bien justement.
    on le voit très bien avec bash quand l'option -x est positionnée avec la commande set (dash ne le montre pas, mais a le même comportement), les noms de fichiers comportant plusieurs mots sont protégés (par des quotes) et traités comme un seul mot.

    là , où le code de thibaut06 risque d'aller de travers, c'est si un dossier comporte un espace, car tout est dans une seule variable, qui sera lue dans une boucle for, qui, elle, itérera sur chaque mot de la variable.

    la solution posix serait de piper la sortie de find à une boucle while read.

    en bash, j'utiliserais un tableau
    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
    #!/bin/bash
     
    mapfile -t directories < <(find -type d -printf '%P\n')
     
    for d in "${directories[@]}"
    do
       i=0
       for f in "$d"/*.{jpg,png,gif}
       do
          xt="${f##*.}"
          mv "$" "$d-$((++i)).$xt"
       done
       echo "Finished renaming file in $d"
    done
    echo "Finished batching."
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre éprouvé
    Homme Profil pro
    consultant ETL
    Inscrit en
    Septembre 2008
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : consultant ETL
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2008
    Messages : 97
    Par défaut espaces
    Perso, quand un répertoire Unix est (hélas) partagé et que des utilisateurs y déposent des doc Word avec des espaces dans les noms,
    je me lève et je vais les taper...

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 867
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 12 867
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par qqcvd Voir le message
    Perso, quand un répertoire Unix est (hélas) partagé et que des utilisateurs y déposent des doc Word avec des espaces dans les noms,
    je me lève et je vais les taper...
    Alors que moi, tel un superhéros de Marvel, je gère dans l'ombre et invisible mais néanmoins avec efficacité pour que mes utilisateurs puissent utiliser en toute quiétude les noms de leur choix sur ce système d'une fiabilité à toute épreuve...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Tri d'une liste de fichiers selon un ordre
    Par Geoffrey49000 dans le forum Général Java
    Réponses: 1
    Dernier message: 09/09/2011, 01h03
  2. Liste fichiers selon nom
    Par doulie dans le forum MATLAB
    Réponses: 5
    Dernier message: 08/07/2011, 10h24
  3. [XL-2007] Renommer liste de fichiers totalement differents
    Par bomaletoi dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 21/04/2010, 22h40
  4. Réponses: 4
    Dernier message: 12/10/2009, 18h55
  5. Liste de fichier selon leur date de modification
    Par ManuV dans le forum Général Java
    Réponses: 7
    Dernier message: 11/02/2009, 13h25

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