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 06/03/2012, à 15:51

ReRRemi

[Résolu] Script modification nom de fichiers

Bonjour à tous !

Voilà je n'ai malheureusement pas assez d'expérience pour arriver à faire un script qui me convient.

J'ai plusieurs fichier du genre :

CS-XSO-7808364097-de_nuke.dem
CS-XSO-4434777842-de_nuke.dem
CS-XSO-1335468752-de_tuscan.dem

J'aimerais supprimer tout ce qu'il y a avant le "de_" et s'il y  a deux de_nuke comme l'exemple , le deuxième se renomme en de_nuke1.dem, s'il y en a 3 de_nuke2.dem, etc...

Voilà ce que j'ai commencé à écrire :

#!/bin/bash
map="de_nuke
de_dust2
de_mirage
de_tuscan
de_prodigy
de_russka
de_cbble
de_nuke
de_forge
de_inferno"

# On boucle pour chaque fichier de_*
for m in $map
do
   # On initialise la variable i à 0
   i=0
   # On boucle pour chaque fichier de_nuke par exemple
   for file in `ls *$m.dem`
   do
      # Si i est égale ou plus grand que 1 alors renommer le fichier en de_nuke(i).dem
      if [ $i -ge 1 ]
      then
         mv $file "$m$i.dem"
     # Ou alors on renomme le fichier en de_nuke.dem
      else
         mv $file $m.dem
      fi
     # On incrémente i d'un (i++)
      i=$(($i+1))
   done
done

Mais dans ce cas je suis obligé de mettre les noms de chaque fichier (or j'aimerais que ça le fasse pour tous les fichier de_*).
De plus j'ai l'erreur suivante avec ls lorsque je fais un ls *de_forge car il n'y a aucun fichier de_forge dans le dossier :
ls: impossible d'accéder à de_forge: Aucun fichier ou dossier de ce type

Et je ne veux pas qu'il remonte ce message hmm.

Merci d'avance pour toute aide smile

Dernière modification par ReRRemi (Le 06/03/2012, à 17:27)

Hors ligne

#2 Le 06/03/2012, à 16:25

sputnick

Re : [Résolu] Script modification nom de fichiers

Salut,

$ ls -1
aaa-de_prodigy.dem
bar-de_dust2.dem
base-de_mirage.dem
CS-XSO-1335468752-de_tuscan.dem
CS-XSO-4434777842-de_nuke.dem
CS-XSO-7808364097-de_nuke.dem
fichier
foo-de_nuke.dem
qux-de_tuscan.dem
rrr-de_cbble.dem
script
ttt-de_nuke.dem
uuu-de_inferno.dem
yyy-de_forge.dem
zzz-de_russka.dem

$ bash script
mv CS-XSO-4434777842-de_nuke.dem de_nuke_1.dem
mv CS-XSO-7808364097-de_nuke.dem de_nuke_2.dem
mv foo-de_nuke.dem de_nuke_3.dem
mv ttt-de_nuke.dem de_nuke_4.dem
mv bar-de_dust2.dem de_dust2_1.dem
mv base-de_mirage.dem de_mirage_1.dem
mv CS-XSO-1335468752-de_tuscan.dem de_tuscan_1.dem
mv qux-de_tuscan.dem de_tuscan_2.dem
mv aaa-de_prodigy.dem de_prodigy_1.dem
mv zzz-de_russka.dem de_russka_1.dem
mv rrr-de_cbble.dem de_cbble_1.dem
mv CS-XSO-4434777842-de_nuke.dem de_nuke_1.dem
mv CS-XSO-7808364097-de_nuke.dem de_nuke_2.dem
mv foo-de_nuke.dem de_nuke_3.dem
mv ttt-de_nuke.dem de_nuke_4.dem
mv yyy-de_forge.dem de_forge_1.dem
mv uuu-de_inferno.dem de_inferno_1.dem

Le script modifié :

#!/bin/bash

map="de_nuke
de_dust2
de_mirage
de_tuscan
de_prodigy
de_russka
de_cbble
de_nuke
de_forge
de_inferno"

# On boucle pour chaque fichier de_*
for m in $map; do
    c=1
    for file in *$m.dem; do
        echo mv "$file" "$(sed "s@.*$m.dem@${m}_${c}.dem@" <<< "$file")"
        ((c++))
   done
done

Ne reste plus qu'à enlever le echo

Remarques :
- on n'itere jamais sur la sortie de ls, c'est caca ! http://partmaps.org/era/unix/award.html#ls
- on n'utilise plus la forme ` ` mais plutot $( ) qui est moins bugué et plus lisible.
- tant qu'à utiliser bash, autant utiliser la forme de tests [[ ]] car c'est bien plus puissant
- je prefere la forme arithmetique (( )) beaucoup plus lisible que des [ -ge ] etc...

Si t'a des questions, je suis pas loin, appelle wink

Dernière modification par sputnick (Le 06/03/2012, à 16:32)


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#3 Le 06/03/2012, à 16:36

credenhill

Re : [Résolu] Script modification nom de fichiers

hello
à tester, bien sûr ..

$ ls
CS-XSO-1335468752-de_tuscan.dem  CS-XSO-1335468788-de_tuscan.dem  CS-XSO-7808364097-de_nuke.dem
CS-XSO-1335468777-de_tuscan.dem  CS-XSO-4434777842-de_nuke.dem
$ 
$ ls | awk '{printf "mv %s ",$0 ; sub("^.*-",""); if(x[$1]++)sub("[.]", ++n[$1] ".") ; print}' | sh
$ 
$ ls
de_nuke.dem  de_nuke1.dem  de_tuscan.dem  de_tuscan1.dem  de_tuscan2.dem
$ 

Hors ligne

#4 Le 06/03/2012, à 16:39

Watael

Re : [Résolu] Script modification nom de fichiers

#!/bin/bash

# on utilise un tableau
map=(
de_nuke
de_dust2
de_mirage
de_tuscan
de_prodigy
de_russka
de_cbble
de_nuke
de_forge
de_inferno
)

# au cas où il n'y a pas de fichier qui correspond à un élément du tableau
shopt -s nullglob

for i in "${map[@]}"
do
   for f in *"$i.dem"
   do  
      mv "$f" "${i}$n.dem"
      ((n++))
   done
   unset n
done

comment obtiens-tu la liste map?

Dernière modification par Watael (Le 06/03/2012, à 17:03)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 06/03/2012, à 16:42

binouche22

Re : [Résolu] Script modification nom de fichiers

Bonjour,

tu dois pouvoir faire:

rename "s@.*$m.dem@${m}_${c}.dem@" $file

au lieu de

mv "$file" "$(sed "s@.*$m.dem@${m}_${c}.dem@" <<< "$file")"

binouche22

Hors ligne

#6 Le 06/03/2012, à 16:49

sputnick

Re : [Résolu] Script modification nom de fichiers

Tout à fait, bien vu binouche22.


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#7 Le 06/03/2012, à 17:26

ReRRemi

Re : [Résolu] Script modification nom de fichiers

O_O Mais MERCI pour toutes ces réponses, j'en attendais pas autant c'est juste génial merci à tous !

Alors @sputnick, merci pour ton script modifié et surtout merci pour tes remarques. Ca va m'aider dans l'avenir, je code en shell en regardant les divers scripts sur internet certain datant de 2003 ou 2006 donc en effet je code comme un pied tongue, tant que ça fonctionne je ne me pose pas de question big_smile.

Watael a écrit :

comment obtiens-tu la liste map?

Je ne la récupère pas, j'aimerais bien que ça se fasse automatiquement (de_?? devient une variable) mais je ne vois pas comment faire alors j'insère les maps les plus jouées dans un tableau (il y a peu de chance qu'on utilise d'autres maps mais sait-on jamais)... Merci en tout cas pour la ligne "shopt -s nullglob" c'est bon à savoir big_smile

Je vois que grâce à credenhill, c'est possible, je n'arrive pas à comprendre son code pour l'instant, donc je vais l'étudier car il fonctionne pour tous les fichiers même ceux qui n'ont pas l'extension "dem". Suffit de faire un ls *.dem au début et le tour est joué, c'est excellent !

En tout cas merci à vous tous de m'avoir aidé tongue

Dernière modification par ReRRemi (Le 06/03/2012, à 18:18)

Hors ligne

#8 Le 06/03/2012, à 17:43

sputnick

Re : [Résolu] Script modification nom de fichiers

Un petit one-liner perl wink


$ ls -1
CS-XSO-4434777842-de_nuke.dem
CS-XSO-7808364097-de_nuke.dem
CS-XSO-9998364097-de_nuke.dem
 
$ perl -le 'do{ $f = $_; s/.*de_nuke.dem/de_nuke/; rename $f, "$_" . ++$c . ".dem"; } for glob "*"' *de_nuke.dem

$ ls
de_nuke1.dem  de_nuke2.dem  de_nuke3.dem

Edit:
Et pour récupérer les motifs :

printf '%s\n' * | sed -rn '/.dem$/{s@.*(de_[a-Z0-9]+)\.dem$@\1@;p;}'
de_prodigy
de_dust2
de_mirage
de_tuscan
de_nuke
de_nuke
de_nuke
de_tuscan
de_cbble
de_nuke
de_inferno
de_forge
de_russka

Dernière modification par sputnick (Le 06/03/2012, à 18:29)


On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#9 Le 06/03/2012, à 18:38

Watael

Re : [Résolu] Script modification nom de fichiers

finalement

#!/bin/bash

suf=".dem"
declare -A radix
shopt -s nullglob
for f in *"$suf"
do rad="${f##*_}"
   rad="${rad%.*}"
   echo mv "$f" "$rad$((++radix[$rad]))$suf"
done

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne