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 13/09/2010, à 23: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, à 23: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, à 09: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 : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#3 Le 15/09/2010, à 21:02

sputnick

Re : Script de renommage fichier récursif

big_smile
+1
Ca reste un bon exercice si tu débute en scripting


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

Hors ligne

#4 Le 20/09/2010, à 12: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, à 23: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, à 23: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 wink
- 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 ! wink

Dernière modification par sputnick (Le 20/09/2010, à 23:53)


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

Hors ligne

#7 Le 21/09/2010, à 00: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 smile
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 !! smile 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, à 17: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, à 23: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, à 23:43)


Merci de mettre [RESOLU] dans le titre de votre post une fois le  probleme reglé!

GNU/Linux -> \o/

Hors ligne

#9 Le 01/03/2011, à 00: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, à 10:05

TraGiKomiK

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.


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 tongue
PS: Si quelqun a une idée pour l'IFS wink


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, à 10:19

ehmicky

Re : Script de renommage fichier récursif

TraGiKomiK a écrit :

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, à 10: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, à 10: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, à 14:44

FRUiT

Re : Script de renommage fichier récursif

TraGiKomiK a écrit :

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, à 15: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, à 15: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 big_smile Par contre niveau comprehension hmm (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 big_smile

[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, à 15: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, à 15:49

FRUiT

Re : Script de renommage fichier récursif

#!/bin/bash

Jusque là ça va je présume smile


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 smile


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, à 17: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, à 16: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, à 16: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, à 16: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.

TraGiKomiK a écrit :

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, à 20: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, à 21:15

TraGiKomiK

Re : Script de renommage fichier récursif

Merci pour ces explications wink Je pense avoir compris, reste a mettre en oeuvre pour confirmation big_smile

"Problemes" et questions resolues pour moi big_smile 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, à 21: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, à 16: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, à 21: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, à 17:30

TraGiKomiK

Re : Script de renommage fichier récursif

re,

Alors Wahou!! Encore plus de choses a mettre en pratique lol

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 hmm).


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, à 18: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, à 19: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, à 21: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 12/04/2016, à 00:08)

Hors ligne