#1 Le 13/09/2010, à 22:30
- Maisondouf
Script de renommage fichier récursif
Pour des raisons bêtes, j'ai eu besoin de supprimer les espaces contenus dans les noms de mes fichiers photos (merci Piwigo).
Après des heures de tests, le scripte capable de remplacer les ' ' par des '_' dans mes noms de fichier fonctionne.
A sauver sous un nom parlant...
#!/bin/sh
# renommage des fichiers et des répertoires qui ont des espaces dans leur nom
# remplacement de ' ' par '_'
change_blanc() {
[ -d "$1" ] || { echo "erreur: vous devez donner un nom de répertoire" ; exit 1 ; }
if [ "`echo $1 | grep ' '`" != "" ]; then
NOUVEAU=`echo $1 | sed 's/ /_/g'`
echo "$MYDIR/($1) --- $NOUVEAU"
mv "$1" "$NOUVEAU"
else
NOUVEAU=$1
fi
echo ; echo "Exploration de $NOUVEAU."
# changement vers $1
cd "$NOUVEAU"
# sauvegarde répertoire de départ
local MYDIR="${PWD}"
for FICHIER in *
do
if [ -d "${FICHIER}" ] ; then
change_blanc "${FICHIER}"
# retour répertoire du dessous
cd "${MYDIR}"
else
if [ "`echo $FICHIER | grep ' '`" != "" ]; then
NOUVEAU=`echo $FICHIER | sed 's/ /_/g'`
echo "$MYDIR/($FICHIER) --- $NOUVEAU"
#mv "$FICHIER" "$NOUVEAU"
fi
fi
done
}
change_blanc $1
utilisation 'scrpite-name répertoire' ou 'scripte-name .' pour le répertoire courant.
Dernière modification par Maisondouf (Le 13/09/2010, à 22:41)
ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor, OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)
Hors ligne
#2 Le 14/09/2010, à 08:09
- nesthib
Re : Script de renommage fichier récursif
sinon tu peux aussi utiliser la commande rename :
rename 's/ /_/g' *
ps. j'ai déplacé ton fil dans la section appropriée
pps. ton script comporte plein de maladresses, je n'ai pas le temps de voir ça pour le moment mais si ça t'intéresse je pourrais te les montrer plus tard
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#3 Le 15/09/2010, à 20:02
- sputnick
Re : Script de renommage fichier récursif
+1
Ca reste un bon exercice si tu débute en scripting
Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr
Hors ligne
#4 Le 20/09/2010, à 11:51
- Maisondouf
Re : Script de renommage fichier récursif
ben oui, ya pas de mal:lol:
ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor, OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)
Hors ligne
#5 Le 20/09/2010, à 22:35
- ehmicky
Re : Script de renommage fichier récursif
Si je peux me permettre des critiques (désolé c'est vraiment pas pour critiquer mais pour essayer d'améliorer le script)
J'avais justement moi-même fait ce script, et en fait je verrais ces points :
- plutôt que d'utiliser cd pour changer de répertoire, tu peux simplement manipuler une variable $rep_courant que tu modifies au fil de la récursion, et que tu utilises à la place d'un chemin relatif
- tu as des bouts de code qui font doublons, et que tu pourrais unifier avec un autre design de la boucle récursive
- enfin, et surtout, ta boucle récursive analyse les répertoires avant leur contenu. Le résultat est que si un répertoire dont le nom contient un espace, contient lui-même un fichier au nom problématique, le répertoire sera renommé, mais le fichier qu'il contient ne le pourra plus, du fait du renommage de son répertoire courant. Tu peux tester toi-même pour mieux voir.
Enfin, en idée d'amélioration, tu peux tenter de ne pas checker que les espaces, mais l'ensemble des caractères illégaux : [^[:alnum:]_.-] ou quelque chose de ce style !
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#6 Le 20/09/2010, à 22:51
- sputnick
Re : Script de renommage fichier récursif
Autre choses :
- rename c'est juste Larry Wall qui l'a écrit... Un ptit gars qui aime bien bidouiller
- les ` ( backticks ) sont considérés comme dépréciées. On préfère utiliser la forme $() qui ne comporte pas les problèmes d'imbriquations des backticks :
sputnick@FreAkyLab:$ echo "$(echo "je suis $(whoami) et nous sommes le $(date)")"
je suis sputnick et nous sommes le lun. sept. 20 23:48:52 CEST 2010
sputnick@FreAkyLab:$ echo "`echo "je suis `whoami` et nous sommes le `date`"`"
bash: command substitution: line 1: Caractère de fin de fichier (EOF) prématuré lors de la recherche du « " » correspondant
bash: command substitution: line 2: Erreur de syntaxe : fin de fichier prématurée
bash: et : commande introuvable
bash: command substitution: line 1: Caractère de fin de fichier (EOF) prématuré lors de la recherche du « " » correspondant
bash: command substitution: line 2: Erreur de syntaxe : fin de fichier prématurée
whoamidate
Et c'est bien plus lisible !
Dernière modification par sputnick (Le 20/09/2010, à 22:53)
Je sais, un peu partout, tout le monde s'entretue, c'est pas gai, mais d'autres s'entrevivent, j'irai les retrouver. Jacques Prévert
https://sputnick.fr
Hors ligne
#7 Le 20/09/2010, à 23:31
- ehmicky
Re : Script de renommage fichier récursif
Sans vouloir te décourager, je voulais juste te donner une idée rapide de combien il est possible de raccourcir ce script :
#!/bin/bash
find "$1" -regextype "posix-extended" -depth -regex ".*[^-[:alnum:]./_~].*" | while read fichier ; do
mv "$fichier" "${fichier//[^[:alnum:].\-_\/~]/_}"
done
Je dis pas que c'est parfait, mais bon c'est déjà plus court et plus rapide
Avec amélioration possibles : ne marche pas avec les noms de fichier contenant des newlines ; messages d'avertissement/confirmation ; gestion des problèmes de droit d'accès ; création d'un backup.
find est ici plus rapide qu'une fonction récursive full-bash.
Par ailleurs, comme le dit Sputnik, cela ne sert à rien de réinventer la roue quand il existe des outils déjà créés et testés : utiliser rename est 100 fois plus clair, performant, viable, portable, etc.
Mais bon, j'espère que tout cela ne va pas te décourager pour autant, c'est toujours cool d'écrire des scripts !! Désolé pour les ondes négatives.
Edit : autre approche possible si seuls les espaces t'intéressent :
#!/bin/bash
shopt -s globstar
while read fich ; do
mv "$fich" "${fich// /_}"
done < <(printf "%s\n" $1/**/*\ * | tac)
Dernière modification par ehmicky (Le 21/09/2010, à 16:13)
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#8 Le 28/02/2011, à 22:27
- TraGiKomiK
Re : Script de renommage fichier récursif
Bonjour a tous,
Je me permet de remonter ce post car je me penche aussi sur le sujet depuis peu (ce script et l'apprentissage des bases du bash).
Apres beaucoup d'essais (et pas mal de recherches, d'ailleurs nombreux sont les posts sur cette question) je n'arrive toujours pas a avoir un script recursif: cela me renomme toujours les repertoires en premiers donc erreurs pour les fichiers/repertoires contenus dasn ceux ci... (y compris avec le premier code de ehmicky du precedent message, le deuxieme consommant le processeur a 100% mais pas de renommage :/, le probleme etant surtout la non comprehension du code alors que c'est le but originel ;) )
Etant vraiment noob voici ou en est mon script (dont je comprend le contenu, ou presque: voir edit):
#!/bin/bash
IFS='
'
for i in $(find $1 -depth -name "* *")
do
echo "renommage du fichier : $i"
rename 's/ /_/g' $i
done
Si vous avez des solutions (et explications a celles-ci) je suis preneur. Merci de votre attention :D
[EDIT] Alors ce que je ne comprend pas c'est pourquoi le fait de definir l'IFS de cette maniere resoud le probleme de saut de ligne... Je suppose que c'est car on indique que l'espace que correspond pas a un saut de ligne justement, mais pour quoi l'ajout de "" autour de $i ne resoud pas le probleme alors? Merci des infos si vous avez la reponse :D
Dernière modification par TraGiKomiK (Le 28/02/2011, à 22:43)
Merci de mettre [RESOLU] dans le titre de votre post une fois le probleme reglé!
GNU/Linux -> \o/
Hors ligne
#9 Le 28/02/2011, à 23:09
- ehmicky
Re : Script de renommage fichier récursif
Normalement avec -depth, les fichiers contenus dans un répertoire sont traités avant celui-ci. En fait mes deux codes étaient assez mauvais je crois, il suffit de faire :
shopt -s globstar
rename 's/ /_/g' **
je pense (pas testé).
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#10 Le 01/03/2011, à 09:05
- TraGiKomiK
Re : Script de renommage fichier récursif
re,
Normalement avec -depth, les fichiers contenus dans un répertoire sont traités avant celui-ci
Exact, mais cela ne s'applique pas au sous repertoires.
shopt -s globstar
rename 's/ /_/g' **
Donne le meme resultat (modification des repertoires et donc rename impossible car fichiers plus a la bonne adresse).
Y'a vraiment de quoi devenir (un peu plus) dingue
PS: Si quelqun a une idée pour l'IFS
Merci de mettre [RESOLU] dans le titre de votre post une fois le probleme reglé!
GNU/Linux -> \o/
Hors ligne
#11 Le 01/03/2011, à 09:19
- ehmicky
Re : Script de renommage fichier récursif
re,
ehmicky a écrit :Normalement avec -depth, les fichiers contenus dans un répertoire sont traités avant celui-ci
Exact, mais cela ne s'applique pas au sous repertoires.
Hum je crois que si (j'utilisais le terme fichier au sens large, dont les répertoires)
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne
#12 Le 01/03/2011, à 09:30
- TraGiKomiK
Re : Script de renommage fichier récursif
Alors malheureusement non, ou c'est ma syntaxe qui n'est pas bonne:
┌─ [tragikomik] ───── [09:22:03] ───── (/home/tragikomik)
└────>$ ls testscript/
test 1 test 2 test 3
┌─ [tragikomik] ───── [09:22:10] ───── (/home/tragikomik)
└────>$ ls testscript/test\ 3/
test 4 test 5
┌─ [tragikomik] ───── [09:22:23] ───── (/home/tragikomik)
└────>$ ls testscript/test\ 3/test\ 5/
test 6
┌─ [tragikomik] ───── [09:27:03] ───── (/home/tragikomik)
└────>$ cd testscript/
┌─ [tragikomik] ───── [09:31:31] ───── (/home/tragikomik/testscript)
└────>$ find . -depth -name "* *" -exec rename 's/ /_/g' {} \;
Can't rename ./test 3/test 5/test 6 ./test_3/test_5/test_6: Aucun fichier ou dossier de ce type
Can't rename ./test 3/test 5 ./test_3/test_5: Aucun fichier ou dossier de ce type
Can't rename ./test 3/test 4 ./test_3/test_4: Aucun fichier ou dossier de ce type
┌─ [tragikomik] ───── [09:28:32] ───── (/home/tragikomik/testscript)
└────>$ ls test_3/
test 4 test 5
[EDIT] modif car erreur dans le copier/coller
Dernière modification par TraGiKomiK (Le 01/03/2011, à 09:33)
Merci de mettre [RESOLU] dans le titre de votre post une fois le probleme reglé!
GNU/Linux -> \o/
Hors ligne
#13 Le 01/03/2011, à 13:44
- FRUiT
Re : Script de renommage fichier récursif
Exact, mais cela ne s'applique pas au sous repertoires.
Ceci semble convenir non ?
#!/bin/bash
shopt -s globstar
for e in **; do
p="${e%/*}" ; f="${e##*/}"
[ "${f% *}" != "${f}" -a -f "$e" ] && echo "${p}/${f// /_}"
done
(Ou mv "${f}" "${p}/${f// /_}" au lieu de echo)
(Changer éventuellement le ** par "$1"/** ou autre)
Dernière modification par FRUiT (Le 01/03/2011, à 14:22)
Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
Hors ligne
#14 Le 01/03/2011, à 14:25
- TraGiKomiK
Re : Script de renommage fichier récursif
salut FRUiT,
Alors oui ton script renomme parfaitement tout les fichiers compris dans les repertoires ainsi que les sous-repertoires Par contre niveau comprehension
(il est deja dur de trouver des explications comprehensibles, surtout ne comprenant pas tres bien l'anglais, sur shopt).
Va faloir que je me plonge serieusement dans bash et les caracteres speciaux...
J'en demande beaucoup mais: pour renommer aussi les repertoires?
Aurais tu d'ailleurs une idée concernant l'IFS (post #8)?
Merci pour l'aide et les commandes
[EDIT] Ma demande pour renommer aussi les dossiers sort du contexte de ce post, merci de me signaler si l'ouverture d'un nouveau sujet et plus approprié (y compris pour la comprehension de celui ci)
Dernière modification par TraGiKomiK (Le 01/03/2011, à 14:33)
Merci de mettre [RESOLU] dans le titre de votre post une fois le probleme reglé!
GNU/Linux -> \o/
Hors ligne
#15 Le 01/03/2011, à 14:49
- FRUiT
Re : Script de renommage fichier récursif
#!/bin/bash
Jusque là ça va je présume
shopt -s globstar
Activation de l'option bash qui va développer ** en "tout élément de l'arborescence à partir du répertoire courant".
for e in **; do
Pour chacun des éléments,
p="${e%/*}"
f="${e##*/}"
définit deux variables p et f qui contiennent respectivement le chemin (path), et le nom de l'élément.
%/* signifie "couper tout ce qui est à droite à partir du dernier slash / de l'élément e", en résulte donc le chemin.
##*/ signifie "couper tout ce qui est à gauche du dernier /", en résulte donc le nom du fichier.
Cela sert à pouvoir traiter le nom du fichier tout en préservant le chemin dans une variable séparée.
[ "${f% *}" != "${f}"
Si dans le nom de fichier f un espace est détecté, la condition est vraie. Pour expliquer il s'agit de "couper tout ce qui se trouve à droite du dernier espace" ( ${f% *} ) et de comparer avec le nom originel "$f". S'il n"y a pas d'espaces dans le nom, alors les 2 chaines sont équivalentes, et la condition se trouve donc fausse.
-a
ET
-f "$e" ]
que l'élément e est bien un fichier, et non un répertoire,
&& echo
Alors affiche,
"${p}/${f// /_}"
le chemin de l'élément, préservé (on ne travaille que sur f), suivi d'un /, suivi du nom de fichier (basename) de l'élément e en remplacant tout espace par un underscore (forme ${var//pattern1/pattern2}, remplacer toute occurence de pattern1 par pattern2 dans la chaine var).
done
Le job est fait
Escuse moi j'ai mal compris ta question sur l'IFS... Quelle est-elle exactement ?
Pour shopt c'est facile, la commande -s ACTIVE une option, tandis que -u DESACTIVE.
Après pour la liste des options il doit y avoir des traductions de man bash qui trainent quelque part.
Les options de bash peuvent se définir lors de son invocation comme pour toute autre commande (genre bash -a -b -c arg -d ...) sauf que, une fois bash invoqué on ne peut plus modifier la ligne de commande originelle, c'est pourquoi shopt a été inventé : modifier les options dynamiquement DEPUIS bash (ou un script).
Dernière modification par FRUiT (Le 01/03/2011, à 16:30)
Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
Hors ligne
#16 Le 01/03/2011, à 15:02
- TraGiKomiK
Re : Script de renommage fichier récursif
Merci mille fois pour toutes ces expliactions :D Ca fait plaisir d'apprendre autant :D
Pour ce qui est de l'IFS:
Si je ne me trompe pas l'IFS sert a determiner ce qui est consideré comme saut de ligne (par default espace \n et tabulation je crois, me corriger si je me trompe).
Alors pourquoi dans le script suivant les "" ne permette pas d'avoir le meme resultat que IFS=''? (Comme quoi les discussions sur les guillemets avec toi :P).
Script en question:
#!/bin/bash
IFS='
'
for i in `find $1 -name .*.mp3`
do
echo "suppression du fichier : $i"
rm $i
done
Je sens que ca va etre tot co* :(
[EDIT] Je vais me pencher sur le man bash ;) ne sachant pas (et n'ayant pas compris) que c'etait une option de celui ci je n'avais pas du tout cherché dans cette direction ;)
Dernière modification par TraGiKomiK (Le 01/03/2011, à 15:07)
Merci de mettre [RESOLU] dans le titre de votre post une fois le probleme reglé!
GNU/Linux -> \o/
Hors ligne
#17 Le 01/03/2011, à 15:35
- FRUiT
Re : Script de renommage fichier récursif
Euh alors pour l'histoire des guillements, c'est à cause de l'utilisation conjointe de for et find. Find ne protège pas les noms trouvés avec des guillemets avant de les passer à for, qui lui utilise la variable IFS pour découper le résultat. Donc avec un IFS par défaut (espace, tabulation, saut de ligne) ça ne marche pas car for découpe à chaque espace.
Si je ne me trompe pas l'IFS sert a determiner ce qui est consideré comme saut de ligne (par default espace \n et tabulation je crois, me corriger si je me trompe).
Petite nuance l'IFS est le séparateur d'arguments pendant le traitement des développements des commandes.
Ton IFS ce n'est pas IFS='' attention, c'est IFS='<il y a un saut de ligne ici>
' , ainsi for découpe suivant les sauts de ligne de find uniquement et ignore les espaces, et ça marche. Cette astuce est plutôt pour sh, et peut s'écrire en bash IFS=$'\n' .
Cela dit, ces problèmes n'en sont pas et peuvent être évités dans ton script. Au niveau du concept on utilise jamais for et find en même temps (sauf rare exception ou bien alors en sh qui n'a ni l'option globstar ni plein d'autres) car c'est une redondance. C'est cette erreur qui conduit ensuite a 'rustiner' avec IFS.
Voici des exemples sans IFS :
Soit tu utilises find seul :
find "$1" -name ".*.mp3" -exec rm {} && echo "{} supprimé" \;
Soit tu utilises for seul :
for i in "$1"/.*.mp3; do rm "$i" && echo "$i supprimé"; done
ou :
shopt -s globstar
for i in "$1"/**/.*.mp3; do rm "$i" && echo "$i supprimé"; done
Voilà j'espère avoir répondu à ta question (pas très sur lol)...
Et petit moyen mnémotechnique pour shopt : -s veut dire set, -u unset.
Dernière modification par FRUiT (Le 01/03/2011, à 19:51)
Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
Hors ligne
#18 Le 01/03/2011, à 20:15
- TraGiKomiK
Re : Script de renommage fichier récursif
Merci pour ces explications Je pense avoir compris, reste a mettre en oeuvre pour confirmation
"Problemes" et questions resolues pour moi merci
Merci de mettre [RESOLU] dans le titre de votre post une fois le probleme reglé!
GNU/Linux -> \o/
Hors ligne
#19 Le 01/03/2011, à 20:29
- FRUiT
Re : Script de renommage fichier récursif
De rian ^^
Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
Hors ligne
#20 Le 02/03/2011, à 15:03
- FRUiT
Re : Script de renommage fichier récursif
Alors pour les dossiers, le problème c'est qu'il faut partir des dossiers les plus lointains dans l'arborescence, puis revenir de niveau en niveau jusqu'à la profondeur du dossier de base. Ca donnerait environ ceci :
#!/bin/bash
[ -d "$1" ] || { printf "%s\n" "Usage : ${0##*/} /path/to/folder" ; exit 2 ; }
shopt -s globstar
maxnodes=0
fromnode=$(printf "%s" "$(readlink -e "$1")" | awk '{x+=gsub("/","")}; END {print x}')
printf "%s\n\n" "Building folder tree. Please wait..."
for e in "$1"/**; do
[ -d "$e" ] && {
list+=( "$(readlink -e "${e%/}")" )
nodes=$(printf "%s" "$(readlink -e "${e%/}")" | awk '{x+=gsub("/","")}; END {print x}')
numnodes+=( $nodes )
[ $nodes -gt $maxnodes ] && maxnodes=$nodes
}
done
for ((i=$maxnodes;i>$fromnode;i--)); do
for ((j=0;j<${#list[@]};j++)); do
[ ${numnodes[$j]} -eq $i ] && {
p="${list[$j]%/*}" ; d="${list[$j]##*/}"
[ "${d% *}" != "${d}" ] && printf "%b\n\n" "« ${d} »\nshould be renamed « \033[32m${p}/${d// /_}\033[m »"
# mv "list[$j]" "${p}/${d// /_}"
}
done
done
exit 0
Bon j'ai quand même eu la sensation d'enfoncer une porte ouverte : il doit y avoir plus simple.
Dernière modification par FRUiT (Le 02/03/2011, à 20:52)
Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
Hors ligne
#21 Le 02/03/2011, à 16:30
- TraGiKomiK
Re : Script de renommage fichier récursif
re,
Alors Wahou!! Encore plus de choses a mettre en pratique
Juste une question sur la syntaxe: a quoi sert exactement les parantheses dans variable=( $(...) )?
J'ai trouvé la traduction de la page de man bash, je met le lien aussi pour sauvegarde perso et au cas ou ca puisse servir: man bash fr et ltoutes les commandes ici (malgres que les dernieres mise a jour soit de 2008, donc pas tou jeune ).
Merci de mettre [RESOLU] dans le titre de votre post une fois le probleme reglé!
GNU/Linux -> \o/
Hors ligne
#22 Le 02/03/2011, à 17:20
- FRUiT
Re : Script de renommage fichier récursif
En fait ce n'est pas variable=( .. ), mais tableau=( list ), c'est une manière de remplir les cellules du tableau avec ce qu'il y a entre parenthèses. Exemples :
> alphabet=( a b c )
> echo "${alphabet[0]}"
a
> alphabet+=( d )
> echo "${alphabet[@]}"
a b c d
> echo "${#alphabet[@]}"
4
> ls
a.sh b.txt c.dat
> files=( ~+/* )
> echo "${files[0]}"
/home/fruit/test/a.sh
> echo "${files[@]}"
/home/fruit/test/a.sh /home/fruit/test/b.txt /home/fruit/test/c.dat
Dernière modification par FRUiT (Le 02/03/2011, à 18:00)
Neon Suite by FRUiT (kde4.6) [url]http://[Merci de relire les règles]/yzm7cee[/url]
"Pour la carotte, le lapin est la plus parfaite incarnation du mal" (R. Sheckley)
clean
Hors ligne
#23 Le 11/04/2016, à 20:47
- carnifex.iulius
Re : Script de renommage fichier récursif
Grâce à toutes vos idées, j’ai pu créer une solution qui réponde à mes besoins.
Une fonction (ffn) qui renomme un fichier selon des critères à définir (ici, transformation des espaces et autres caractères problématiques en underscore, suppression de certains caractères)
Une deuxième (renameAll) qui renomme (selon les même critères) tous les fichiers et répertoires situés dans un répertoire donné.
Un alias (ra) qui renomme (selon les même critères) tous les fichiers et répertoires situés dans le répertoire courant.
Une troisième (rar) qui renomme (selon les même critères) tous les fichiers et répertoires situés dans le répertoire courant, avec traitement récursif des sous dossiers.
Code à placer dans son .bashrc :
function ffn #format file name
{
dir=$1
fileName=$2
tmpName=$(echo "$fileName" | tr -d '",;!?:' ) #suppressions de chars bizarres
newName=$(echo "$tmpName" | tr "'/\ ()" "______") #changement en underscore
if [ "$newName" != "$fileName" ]
then mv "$dir/$fileName" "$dir/$newName"
if [ -d "$dir/$newName" ]
then echo "<DIR> $dir/$newName"
else ls "$dir/$newName"
fi
fi
}
#renomme le fichier donné en argument $1, avec sa dir en $2
function renameAll
{
ls "$1" | while read -r f #précisément nécessaire pour les filename avec espaces
do ffn "$1" "$f";
done
}
#renomme ts les fichiers et répertoires du rep $1 ; ne traite pas récursivement
alias ra='renameAll .'
function rar #rename_all_récursif
{
echo "." | cat > liste #le fichier doit exister, ne pas être vide, et contenir le rep courant en fin de liste
shopt -s globstar #permet la récursivité sur l’expression **
for e in **; do
if [ -d "$e" ]
then sed -i "1i\\
$e" liste #ajout des lignes par le début du fichier
fi # (afin de modifier le contenu des feuilles en premier, et le tronc en dernier)
done # constitution de la liste bien ordonnée des répertoires à traiter
ll liste
cat liste | while read -r d #précisément nécessaire pour les filename avec espaces
do renameAll "$d"
done
echo "ok"
}
#formatage général des noms de fichiers et répertoires du répertoire courant et ss répertoires
On peut sans doute faire mieux, mais ça, c’est testé et ça marche (je pense à ceux qui comme moi ne sont pas des cadors).
Modération : merci à l'avenir d'utiliser les balises code (explications ici).
Dernière modification par cqfd93 (Le 11/04/2016, à 23:08)
Hors ligne