#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 .
Merci d'avance pour toute aide
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
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 , tant que ça fonctionne je ne me pose pas de question .
comment obtiens-tu la liste map?
Je ne la récupère pas, j'aimerais bien que ça se fasse automatiquement (de_? où ? 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
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é
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
$ 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