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 30/08/2009, à 13:18

Jean-paul 3

[résolu] Nommage récursif de fichiers

ben, j'ai bien cherché partout et rien trouvé que j'arrive à faire fonctionner.

soit un dossier "Dossier A"
avec pleins de sous-dossiers "Dossier AB", "Dossier AC", "Dossier AD" etc ...
qui eux-même comporte un fichier en blablabla.html

donc :
Dossier A
    Dossier AB
        blablabla.html
    Dossier AC
        blablabla.html
    Dossier AC
        blablabla.html

comment faire en bash (de préférence) afin de renommer les fichiers
blablabla.html
en
unnompareilpour tous les fichiers.html

j'ai cherché avec find et -exec rename, sed et même Awk et j'y arrive poa roll
Merci

Dernière modification par Jean-paul 3 (Le 04/09/2009, à 20:20)

Hors ligne

#2 Le 30/08/2009, à 13:58

Mpok

Re : [résolu] Nommage récursif de fichiers

???

Pourtant un simple find -exec devrait le faire... (surtout avec "unnompareil").
(pas besoin de awk à mon avis).
Quelle est la commande elle-même que tu testes ?
Quelle est l'erreur ?

Hors ligne

#3 Le 30/08/2009, à 16:15

Jean-paul 3

Re : [résolu] Nommage récursif de fichiers

voici la commande que j'ai trouvé et adapté en fouillant sur le net;

find . -name **.html* -exec rename 's/*.html/page.html/g' {} \;

et j'ai droit à ces messages d'erreurs :
Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE / at (eval 1) line 1.
Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE / at (eval 1) line 1.
Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE / at (eval 1) line 1.

je comprend bien (ou crois comprendre) que c'est le *.html au niveau de rename qui pose souci mais je ne sais pas par quoi le remplacer.
Dois-je ajouter que je débute en ligne de commande . hmm
Merci

Hors ligne

#4 Le 31/08/2009, à 20:36

Totor

Re : [résolu] Nommage récursif de fichiers

Jean-paul 3 a écrit :

voici la commande que j'ai trouvé et adapté en fouillant sur le net;

find . -name **.html* -exec rename 's/*.html/page.html/g' {} \;

et j'ai droit à ces messages d'erreurs :
Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE / at (eval 1) line 1.
Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE / at (eval 1) line 1.
Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE / at (eval 1) line 1.

je comprend bien (ou crois comprendre) que c'est le *.html au niveau de rename qui pose souci mais je ne sais pas par quoi le remplacer.
Dois-je ajouter que je débute en ligne de commande . hmm
Merci

Le monsieur te dit que le quantifier ne suit rien dans ton expression...
Le quantifier c'est * et il signifie : le caractère qui précède doit être présent 0 ou plus
mais étant donné qu'il se trouve en 1ère position de ton expression perl (puisque rename utilise les regex perl), il ne sait pas quel caractère doit être présent 0 ou plus

De plus, le point (.) signifie "n'importe quel caractère (une fois)". Pour que ce soit réellement interprété comme un point, il faut l'échaper avec le caractère \
donc actuellement, ta regex signifie : le caractère qui précède 0 ou plus suivit de n'importe quel caractère puis suivi de html (et pas forcément en fin de nom)... 

correction :

find . -type f -name "*.html" -exec rename 's/.*\.html$/page.html/' {} \;

mais attention, comme tu remplaces .*\.html par page.html, alors c'est le nom complet qui va être changé :
exemple :
toto.html --> page.html
titi.html --> page.html

donc, si dans un même dossier, tu as plusieurs fichiers html, en sortie, il n'y en aura qu'un seul !

EDIT : le "g" dans de 's/.*\.html$/page.html/g' n'est pas util

Dernière modification par Totor (Le 31/08/2009, à 20:37)


-- Lucid Lynx --

Hors ligne

#5 Le 01/09/2009, à 09:40

Mpok

Re : [résolu] Nommage récursif de fichiers

Totor a écrit :

donc, si dans un même dossier, tu as plusieurs fichiers html, en sortie, il n'y en aura qu'un seul !

Tout à fait..
Je pense que pour la résolution du pbm, il faudrait empêcher cela...
(note:  déjà, mettre des guillemets dans la specification name, est obligatoire, donc on avance..)

Est-ce que find respecte TOUS les standards des regexp ? (en particulier les arguments de capture).
A essayer :

find . -type f -name "*.html" -exec rename 's/(.*)\.html$/$1.html/' {} \;

Hors ligne

#6 Le 01/09/2009, à 09:54

Totor

Re : [résolu] Nommage récursif de fichiers

Mpok a écrit :

Est-ce que find respecte TOUS les standards des regexp ? (en particulier les arguments de capture).

Il faut utiliser les options -regex ( et sa variante -iregex) à la place de -name (ou -iname) et -regextype pour préciser le type de regex

Mpok a écrit :

A essayer :

find . -type f -name "*.html" -exec rename 's/(.*)\.html$/$1.html/' {} \;

heu là, tu ne renommes rien ....


-- Lucid Lynx --

Hors ligne

#7 Le 01/09/2009, à 10:25

Mpok

Re : [résolu] Nommage récursif de fichiers

Totor a écrit :

heu là, tu ne renommes rien ....

LOL !!! lol
Effectivement !!!
(d'où l'utilité de se relire, ou d'être relu).
Mais je pense que tu as compris l'idée générale ("$1_new" par exemple, mais on s'est peut-être un peu éloigné du sujet original ceci dit).
Merci pour l'option -regexp que je ne connaissais pas.

Hors ligne

#8 Le 01/09/2009, à 20:53

Jean-paul 3

Re : [résolu] Nommage récursif de fichiers

bonsoir,
et merci de vous intéresser à mon petit souci, malheureusement (ou je ne suis pas doué)
les deux scripts proposés ne donnent pas le résultat attendu :
Pour les 2 scripts, le résultat renvoyé et le même.
j'ai testé sur 3 sous-dossiers avec un fichier en .html à l'intérieur, les 2 premiers fichiers ne sont pas modifiés, le troisième se vide (le fichier .html disparait) et un fichier page.html est créé au même niveau que les 3 dossiers !!!
Voici les messages renvoyés par le terminal :

perso@UbuntuPPC:~/Bureau/test$ find . -type f -name "*.html" -exec rename 's/.*\.html/page.html/' {} \;
./Dossier 2/518040_BEL_0203page.html not renamed: page.html already exists
./Dossier 1/518040_BEL_0203page.html not renamed: page.html already exists
perso@UbuntuPPC:~/Bureau/test$

Une idée !

Hors ligne

#9 Le 01/09/2009, à 21:20

Totor

Re : [résolu] Nommage récursif de fichiers

Désolé, pas pris en compte le dossier :

find -type f -name '*.html' -exec rename 's/(.*\/)[^\/]*\.html/$1page.html/' {} +

$find -type f -name '*.html'
./c/cc/toto.html
./b/bb/toto.html
./a/aa/toto.html
$find -type f -name '*.html' -exec rename 's/(.*\/)[^\/]*\.html/$1page.html/' {} +
$find -type f -name '*.html'
./c/cc/page.html
./b/bb/page.html
./a/aa/page.html


-- Lucid Lynx --

Hors ligne

#10 Le 02/09/2009, à 20:03

Jean-paul 3

Re : [résolu] Nommage récursif de fichiers

je pense que c'est plus à moi à te remercier, maintenant cela fonctionne parfaitement smile
Juste pour info, que signifie le " {} +" plutôt que "{} \;" à la fin de la ligne de code ?

Hors ligne

#11 Le 03/09/2009, à 07:01

Mpok

Re : [résolu] Nommage récursif de fichiers

EXCELLENT Totor !! smile

Je viens d'apprendre quelque chose... (ce qui ne veut pas dire que je vais l'utiliser, ce sera dur de se passer du réflexe '\;')

@Jean-paul 3 : cette option '+' signifie : "This  variant of the -exec action runs the specified command on the selected files, but the command line is built by appending each selected file name at the end".
Donc, cela permet D'OPTIMISER le traitement, en ne lançant qu'une commande globale (par répertoire) au lieu de lancer une commande par fichier. Dans le cas de "gros" répertoires, ça peut s'avérer très précieux...
Cela ne peut pas s'appliquer à tous les cas de 'find -exec', mais EN L'OCCURRENCE, bien joué Totor (c'est l'expression régulière qui "différencie" les fichiers).

Hors ligne