Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 14/02/2008, à 08:34

AleX-974

[Rés]Script Bash - Renommer Differents fichiers avec un fichier texte

Bonjour à  tous,

J'ai un petit soucis c'est que je ne sais pas programmer en bash (ou shell). J'ai besoin de faire un petit script et j'aimerai avoir votre aide. Je sais bien que personne ne fais de script à  la demande ici mais j'en ai vraiment besoin et pour samedi. C'est pourquoi jsute quelques indications me suffiront. De mon cà´té je fais déjà  des recherches mais ca risque de faire juste étant donné que je ne fais pas de programmation du tout.

En algorythmique ca donnerai quelque chose comme :

# La variable $Curr-Dir correspond au dossier dans lequel est situé le script et donc les fichier à  renommer et le fichier texte
# La variable $texte correspond au fichier texte qui contient la liste des fichiers a renommer

$i = 1
tant que nonfin $texte 
	lire $texte, $ligne
        $titre = $i $ligne 
	renommer $ligne $titre // je souhaite renommer le fichier désigné par $ligne en y mettant la valeur de $i juste avant son nom
fin tant que
fin

Le but de cet algorythme est de prendre une playliste que j'ai créé auparavant et de renommer les fichiers par rapport à  leur place dans cette playliste. Par exemple la chanson ayant pour titre <titre>, qui apparait en numéro 3 dans la playliste se verra renommer en 03 - <titre>.

J'ai voulu avoir ce script car hier soir j'ai créé une playliste et j'aimerai l'écouter dans cet ordre là  dans mon lecteur mp3. Cependant les fichiers sont tous dans le même dossier et ne se suivent pas tel que je voudrai. Quelqu'un pourrait il m'aider car je galere un peu ne sachant pas comment parcourir un fichier a l'aide de bash. Ne sachant pas renommer un fichier avec une variable. Merci de m'aider j'en ai vraiment besoin.

Dernière modification par AleX-974 (Le 15/02/2008, à 16:26)


Core 2 Duo E4500
Ram : 2 go
DD : 250 go + 320 go
19" : 1440 * 900

Hors ligne

#2 Le 14/02/2008, à 09:23

aeacides

Re : [Rés]Script Bash - Renommer Differents fichiers avec un fichier texte

Je suis un peu dans la même situation que toi: je ne sais pas programmer en Bash. Cependant, avec Google, tu peux trouver quelques articles sur le sujet.

http://www.linuxforums.org/forum/linux- … -help.html

http://www.icewalkers.com/Linux/Howto/B … TO-12.html

Le mieux est que tu test certains de ces scripts et que tu les adaptes au besoin.

Fait toi un répertoire bidon pour faire tes tests

En espérant que cela puisse t'aider smile


http://www.q-be.ca

Hors ligne

#3 Le 14/02/2008, à 09:36

AleX-974

Re : [Rés]Script Bash - Renommer Differents fichiers avec un fichier texte

Merci bcp. J'ai lu un peu ce que tu m'as donné mais après des recherches personnelles et un autre forum j'ai reussi a faire ca :

#!/bin/bash
i=1
while read line
do 
	titre=$i'-'$line
	mv $line $titre
	i=$(($i+1))
done < text

Ca marche avec 6 fichiers. Mon fichier de playlist en contient 2 ou 3 bonnes centaines j'espere que ca marchera. Je vois pas pourquoi ca marcherai pas d'ailleurs. Je n'ai inséré aucune sécurité dans le script. Si quelqu'un peut voir ce script pour moi et me dire comment l'amélioré pour ne pas avoir de mauvaises surprises je suis preneur. Je testerai mon script ce soir et je vous dirai si ca marche.

Merci d'avoir répondu aeacides.

Dernière modification par AleX-974 (Le 14/02/2008, à 09:36)


Core 2 Duo E4500
Ram : 2 go
DD : 250 go + 320 go
19" : 1440 * 900

Hors ligne

#4 Le 14/02/2008, à 09:40

aeacides

Re : [Rés]Script Bash - Renommer Differents fichiers avec un fichier texte

Ya pas de quoi :- ) reviens nous la dessus si ça marche ou non ... et , je sais que ça va paraà®tre stupide, mais n'oublie pas de te faire une backup de tes trucs avant de tester, on sait jamais. tongue Mais bon, je suis sur que tu y avais déja pensé cool

@+


http://www.q-be.ca

Hors ligne

#5 Le 14/02/2008, à 09:55

AleX-974

Re : [Rés]Script Bash - Renommer Differents fichiers avec un fichier texte

Ben oui evidemment ;-)

@+


Core 2 Duo E4500
Ram : 2 go
DD : 250 go + 320 go
19" : 1440 * 900

Hors ligne

#6 Le 14/02/2008, à 09:59

iuchiban

Re : [Rés]Script Bash - Renommer Differents fichiers avec un fichier texte

Je pense que tu peux rajouter un test pour rajouter un 0 devant le numéro si < 10 et même un deuxième si < 100 pour qu'ils soient classés correctement.

#!/bin/bash
i=1
while read line
do
    titre=$i'-'$line
    if [ $i -lt 100 ]
    then
      titre='0'$titre
    fi
    if [ $i -lt 10 ]
    then
      titre='0'$titre
    fi
    mv $line $titre
    i=$(($i+1))
done < text

un truc dans le genre. Sinon tu vas avoir un classement :
1
10
11
[...]
19
2
20
21
3
4
5
6
7
8
9


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#7 Le 14/02/2008, à 10:46

teke

Re : [Rés]Script Bash - Renommer Differents fichiers avec un fichier texte

Au taf cette semaine, et un peu tendu... j'ai pas trop le loisir de me pencher dessus... mais j'ai fais dernièrement quelque chose d'assez proche :

#! /bin/bash
# script pour renommer remplacer les caractères non valides
# des noms de fichiers et répertoires. vim: fdm=marker

# Variables {{{1
# pour la durée {{{2
mydate=`date "+%Y%m%d-%H%M%S"`

# IFS {{{2
OLDIFS=$IFS
IFS="
"

# cd {{{1
# déplacement dans le dossier d'exécution 
cd ${*}
# Indication du dossier courrant
pwd

# fonctions {{{1
# c'est ici que l'on renomme les dossiers et fichiers.
renome() {
# variables {{{2
   # chemin du dossier parent
   d=`echo "${*}" | sed -e 's/^\(.*\/\)[^\/]*/\1/'`
   # nom du fichier/dossier courant
   f=`echo "${*}" | sed -e 's/^.*\/\([^\/]*\)/\1/'`

   # modification du nom de fichier/dossier {{{2
   # Change ce qui n'est pas alphanum et indiqué en "_"
   m=`echo "${f}" | sed -e 's/\([^a-zA-Z0-9_\.-]\)/_/g'`
   # Remplace deux "_" par un seul
   m=`echo "${m}" | sed -e 's/__\+/_/g'`
   # supprime les "_" de fin et de début
   m=`echo "${m}" | sed -e 's/\(_\|\.\|-\)$//g'`
   m=`echo "${m}" | sed -e 's/^\(_\|\.\|-\)//g'`
   # Pour les numéros
   m=`echo "${m}" | sed -e 's/N_\([0-9]\+\)/N\1/g'`
   # Relier les deux cà´tés d'un tiret
   m=`echo "${m}" | sed -e 's/_-_/_-/g'`
   m=`echo "${m}" | sed -e 's/\([Oo]p\|[Nn]o\)[_,\.]\+/\1/g'`
   m=`echo "${m}" | sed -e 's/_\././g'`
   #m=`echo "${m}" | sed -e 's///g'`

   # renommer {{{2
   # Exécute le changement de nom seulement s'il a été changé par la fonction.
   if [ $f != $m ] ; then
      mv "${*}" "${d}${m}"
   fi
} #}}}1

# Recherche des éléments {{{1
# Dossiers {{{2
# Recherche les dossiers à  renommer, niveau par niveau en partant du premier
# jusque à  celui indiqué par le deuxième chiffre de seq.
for i in `seq 1 2` ; do
   echo -e "\nDossiers : niveaux $i"
   for i in `find -P . -mindepth $i -maxdepth $i -type d -printf '%p\n'` ; do
         renome "$i"
   done;
done;

# Fichiers {{{2
# Recherche à  tous les niveaux de l'arborescence les fichier et les renommes.
for i in `find -P . -type f` ; do
   renome "$i"
done;

# IFS {{{1
# replace la variable IFS à  son état original
IFS=$OLDIFS
#}}}1

echo -e "\n  $mydate\n  `date "+%Y%m%d-%H%M%S"`"

Peut être que tu y trouvera quelque chose d'utile. Cependant je ne suis pas un spécialiste du domaine non plus...

#8 Le 14/02/2008, à 11:27

AleX-974

Re : [Rés]Script Bash - Renommer Differents fichiers avec un fichier texte

Super iuchiban j'avais pas pensé à  ce détail. Merci bcp.

Teke c'est un peu compliqué là  :-s je comprend rien. Mais merci quand même. tongue


Core 2 Duo E4500
Ram : 2 go
DD : 250 go + 320 go
19" : 1440 * 900

Hors ligne

#9 Le 14/02/2008, à 12:10

kaer

Re : [Rés]Script Bash - Renommer Differents fichiers avec un fichier texte

Ce petit script python fait ce que tu demandes au premier post. Désolé mais le bash pour moi ausi c'est un peu du sanscrit ;-) (mais je m'y mets et j'essaie de comprebdre les scripts postés).

import sys, os
try: working_directory=sys.argv[1]
except: working_directory='.'
file_path= lambda file_name: os.path.join(working_directory, file_name)
for index_filename in enumerate(open(file_path('file_list.txt')).read().splitlines()):
    os.rename(file_path(index_filename[1]), file_path('%03d-%s' % index_filename))

Pour le tester tu peux lancer le script ci-dessous, ça va te créer un répertoire test (ou planter si il existe, à toi de le supprimer sous ta responsabilité avec rm -r test) avec dedans des fichiers à renommer.

Apres tu fais "cd test" et tu lances le premier script pour vérifier que ça fait bien ce que tu veux.

J'espère que ça t'aidera.

import os

os.mkdir('test')
list_of_files='''elephant
giraffe
brebis
lion
hirondelle
aigle
pingouin
gnou'''
file_list=open('test/file_list.txt', 'w')
file_list.write(list_of_files)
file_list.close()

for filename in list_of_files.splitlines():
    open('test/%s' % filename, 'w')

Hors ligne

#10 Le 14/02/2008, à 13:03

AleX-974

Re : [Rés]Script Bash - Renommer Differents fichiers avec un fichier texte

Merci bcp kaer c'est sympa. Je garde ca sous le coude au cas ou. C'est super sympa cette communauté :-) je regrette vraiment pas d'être passer à  linux. J'espere vite progresser et pouvoir m'en servir plus tard dans ma vie professionnelle (ingénieur en info : bienà´t inscrit a supinfo Réunion)

Voila je dis merci c'est cool les gars cool


Core 2 Duo E4500
Ram : 2 go
DD : 250 go + 320 go
19" : 1440 * 900

Hors ligne

#11 Le 14/02/2008, à 16:02

AleX-974

Re : [Rés]Script Bash - Renommer Differents fichiers avec un fichier texte

J'ai un petit soucis j'ai voulu rajouter la condition if [ -e "$line" ] then .... fi tout autour de la routine mais ca ne marche pas quand la condition n'est pas vérifié le script s'arrete. J'ai voulu mettre cette condition au cas ou il y a des fichiers manquant par rapport à  ma playlist meme si ca ne devrais pas arriver.

Pourriez vous m'aider a résoudre le probleme svp ?


Core 2 Duo E4500
Ram : 2 go
DD : 250 go + 320 go
19" : 1440 * 900

Hors ligne

#12 Le 14/02/2008, à 18:51

freebird

Re : [Rés]Script Bash - Renommer Differents fichiers avec un fichier texte

Si tu veux qu'on corrige un soucis dans ton script, il faut que tu le postes complètement.

Je t'en propose un vite fait qui se fout de là  o๠se trouve les fichiers à  l'origine :

i=1
while read line
do
   # on ne fait le traitement que si c'est un fichier qui existe
   if [ -f "${line}" ]
   then
      # recuperation du nom du fichier
      nom_fichier=`basename "${line}"`

      # creation du nouveau nom de fichier
      new_nom_fichier=`printf "%03d - %s" $i "${nom_fichier}"`
      mv "${line}" "${new_nom_fichier}"

      # incrementation du compteur
      i=$(($i+1))
   fi
done < toto

Hors ligne

#13 Le 15/02/2008, à 06:24

AleX-974

Re : [Rés]Script Bash - Renommer Differents fichiers avec un fichier texte

Pardon Freebird. Merci de ton script il marche impec avec le dossier de test que j'ai. J'avais écris la même chose dans mon script hier soir pour ce qui est de la condition et ca ne marchait pas. Il effectuait le script jsuqu'à  qu'il rencontre un test negatif et là  il s'arretait. J'ai pas tout comprendu. Bref ca marche bien et je t'en remercie. big_smile

Mon script de hier soir était :

#!/bin/bash
i=1
while read line
do
  if [ -e "$line" ] then
    titre=$i'-'$line
    if [ $i -lt 100 ]
    then
      titre='0'$titre
    fi
    if [ $i -lt 10 ]
    then
      titre='0'$titre
    fi
    mv $line $titre
    i=$(($i+1))
  fi
done < text

Je testerai le script de freebird de soir chez moi, et jemettrai sans doute un résolu au sujet.

Dernière modification par AleX-974 (Le 15/02/2008, à 06:26)


Core 2 Duo E4500
Ram : 2 go
DD : 250 go + 320 go
19" : 1440 * 900

Hors ligne

#14 Le 15/02/2008, à 10:01

kaer

Re : [Rés]Script Bash - Renommer Differents fichiers avec un fichier texte

Tu dois mettre un point-virgule avant le THEN quand il est sur la même ligne que le IF

Hors ligne

#15 Le 15/02/2008, à 10:25

Aurel34

Re : [Rés]Script Bash - Renommer Differents fichiers avec un fichier texte

perso je pencherais plutà´t pour la version avec printf... en utilisant peut être "dirname" en plus

i=1
while read line
don
   if [ -f "${line}" ]
   then
      nom_fichier=`basename "${line}"`
      dir_fichier=`dirname "${line}"`
      # creation du nouveau nom de fichier
      new_nom_fichier=`printf "%s/%03d - %s" "${dir_fichier}" $i "${nom_fichier}"`
      mv "${line}" "${new_nom_fichier}"

      # incrementation du compteur
      i=$(($i+1))
   fi
done

#16 Le 15/02/2008, à 16:08

AleX-974

Re : [Rés]Script Bash - Renommer Differents fichiers avec un fichier texte

J'ai testé et ca ne marche pas :-( . Je n'ai mis que le strict minimum en enlevant les conditions :

#!/bin/bash
i=1
while read line
do

new=`printf "%03d - %s" $i "$line"`
mv $line $new

done < text

Et il me dit mv : ne peut evaluer "(le fichier).mp3\r" je ne comprends pas ce que vient faire ce \r là  il n'apparait même pas quand je remplace le mv par un echo.

HELP !!!! :'(

Edit : Finalement ca marche le probleme ne venait pas du script mais du fichier texte fait avec notepad qui y a mis des caracteres de controle de m*rde.

J'ai enfin réussi a faire ce que je voulai merci pour votre aide a tous :-D

Dernière modification par AleX-974 (Le 15/02/2008, à 16:24)


Core 2 Duo E4500
Ram : 2 go
DD : 250 go + 320 go
19" : 1440 * 900

Hors ligne