#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
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 .
Merci
Hors ligne
#4 Le 31/08/2009, à 20:36
- Totor
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 .
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
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
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
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
heu là, tu ne renommes rien ....
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
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 !!
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