Re: renommer en lot
Le (on) mardi 29 janvier 2008 20:00, Jack.R a écrit (wrote) : Il y a au moins un problème avec ce script ; la liste des fichiers à traiter doit tenir sur la ligne de commande. Je viens de faires des essais avec une trentaine de fichier dont les noms font environ 70 caractères, ls passe bien à la ligne mais cela fonctionne. Je crois que ce n'est pas ce ça qu'il s'agissait. Le problème est que la ligne de commande que peut traiter un shell a une longueur limitée. Donc si il y trop de fichiers, le « for i in `ls -r` » va être transformé en « for i in 1.png 2.png [...] n.png » qui va faire exploser le shell si n est trop grand. Euh, ceci dit, en testant là chez moi (sous zsh), un petit % for i in `seq 1 100`; do echo $i ; done; echo ''; n'a pas l'air de faire exploser quoi que ce soit, alors qu'il produit quand même une *très* longue ligne de commande d'après le raisonnement précédent. Cela cloche lorsqu'il y a des espaces dans le nom des fichiers à traiter. C'est logique. Pour éviter ça, on pourrait, avec zsh, faire : for i in **/*.png mais on perd alors le classement par date. Par ailleurs, il y a un autre problème avec le `ls -t -r *.png`, lié au traitement des *, qui est effectué par le shell, et non par ls : ainsi, le -r ne sert ici à rien, car ls ne verra que la liste des .png du répertoire courant, produite par le shell : il ne fera en fait que le classement par date. Manuel. -- Lisez la FAQ de la liste avant de poser une question : http://wiki.debian.net/?DebianFrench Vous pouvez aussi ajouter le mot ``spam'' dans vos champs From et Reply-To: To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: renommer en lot
Vincent Gay a écrit, mardi 29 janvier 2008, à 07:34 : Remys Morrissette a écrit : j'ai une série de fichiers (+/- 25000) ../.. que j'aimerais renommer de façon séquentiel dans le genre 1, 2, 3, , 25000 ou encore, 01, 02, 03, ..., a1, a2, a3, , e... avec l'ordre par date si possible. des idées ? Remys sudo apt-get install krename Ça me semble un peu lourd quand on n'utilise pas KDE : , | Version: 3.0.9-2.1 | Depends: kdelibs4c2a (= 4:3.5.4-1), libacl1 (= 2.2.11-1), libart-2.0-2 | (= 2.3.16), libattr1 (= 2.4.4-1), libaudio2, libc6 (= 2.3.6-6), | libfam0, libfontconfig1 (= 2.3.0), libfreetype6 (= 2.2), libgcc1 (= | 1:4.1.0), libice6, libidn11 (= 0.5.18), libjpeg62, libpng12-0 (= | 1.2.8rel), libqt3-mt (= 3:3.3.6), libsm6, libstdc++6 (= 4.1.0), | libx11-6, libxcursor1 ( 1.1.2), libxext6, libxft2 ( 2.1.1), libxi6, | libxinerama1, libxrandr2, libxrender1, libxt6, zlib1g (= 1:1.2.1) | Size: 315276 ` ~ # apt-get -s install krename Lecture des listes de paquets... Fait Construction de l'arbre des dépendances... Fait Les paquets supplémentaires suivants seront installés : hicolor-icon-theme kdelibs-data kdelibs4c2a libarts1c2a libavahi-qt3-1 liblua50 liblualib50 libopenexr2c2a libqt3-mt menu-xdg Paquets suggérés : fam libqt3-mt-psql libqt3-mt-mysql libqt3-mt-odbc Paquets recommandés : libarts1-akode Les NOUVEAUX paquets suivants seront installés : hicolor-icon-theme kdelibs-data kdelibs4c2a krename libarts1c2a libavahi-qt3-1 liblua50 liblualib50 libopenexr2c2a libqt3-mt menu-xdg 0 mis à jour, 11 nouvellement installés, 0 à enlever et 3 non mis à jour. Avec Perl, on dispose de /usr/bin/prename (= rename), qui permet de renommer à l'aide de commandes : Usage: rename [-v] [-n] [-f] perlexpr [filenames] Pour compter, il faudrait pouvoir initialiser une variable ad-hoc en dehors de la boucle où s'exécute « perlexpr » ; j'ai donc modifié une copie de prename, en vérifiant que la variable $n était libre ~ $ diff prename /usr/bin/ 39,40d38 my $n = 42; ~ $ grep '\$n\' prename my $n = 42; et peux donc renommer séquentiellement les toto_* ~ $ ./prename -n 's/_/_ . $n++ . _/e' toto_* toto_a renamed as toto_42_a toto_b renamed as toto_43_b toto_c renamed as toto_44_c toto_d renamed as toto_45_d toto_e renamed as toto_46_e toto_f renamed as toto_47_f Le script reste léger : ~ $ l prename -rwxr-xr-x 1 lhh lhh 3000 2008-01-29 10:42 prename Pour des besoins plus avancés, on pourrait ajouter une option comme [ -i perlbegin ] pour ne pas avoir à modifier le code en fonction de la valeur initiale. -- Jacques L'helgoualc'h -- Lisez la FAQ de la liste avant de poser une question : http://wiki.debian.net/?DebianFrench Vous pouvez aussi ajouter le mot ``spam'' dans vos champs From et Reply-To: To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: renommer en lot
On 2008-01-28 06:59 +0100, Jack.R wrote: On Mon, 28 Jan 2008 00:11:58 -0500 Remys Morrissette [EMAIL PROTECTED] wrote: j'ai une série de fichiers (+/- 25000) exemple : 0bf153bfa73346bafd4035908ff3a4fb.png Wed Oct 24 00:16:57 2007 0bf30ca8b401ab42ad9adc8327ce8ac7.png Mon Sep 10 21:15:09 2007 acda647ce3d021a81e126f9ccc622139.png Tue May 22 21:17:32 2007 ace127012b35f74f29bf58a82268a98b.png Thu Apr 13 23:52:55 2006 e3e1602a552ffe15b446388239b9299d.png Sun Apr 15 22:36:11 2007 e3e3e4449d314d7abae0d1bba0acdc91.png Mon Sep 10 21:33:37 2007 que j'aimerais renommer de façon séquentiel dans le genre 1, 2, 3, , 25000 ou encore, 01, 02, 03, ..., a1, a2, a3, , e... avec l'ordre par date si possible. Un petit script bash (non testé, donc travailler sur une copie des images) #!/bin/sh count=0 for item in `ls -t -r *.png` do mv $item `printf %06d $count`.png count=$(( $count + 1 )) done Il y a au moins un problème avec ce script ; la liste des fichiers à traiter doit tenir sur la ligne de commande. On aura plus de chances d'aboutir en faisant : find . -name *.png -type f -printf '%T@ %p\n' | sort -n | awk '{ print mv \ $2 \ sprintf(%05d.png, NR) }' | sh Le code ci-dessus suppose que a) aucun des noms de fichiers à renommer ne contient de newlines ou autres métacaractères shell, b) qu'aucun des nouveaux noms n'existent et c) il est acceptable de lancer un process mv par fichier. Voici une autre méthode qui n'a pas ces inconvénients : find . -name *.png -type f -print0 | grep -z '/[0-9a-f]\{32\}\.png$' | perl -we '$/ = \0; while (defined ($pathname = )) { $pathname =~ s/\0$//; print $pathname\n; @s = stat $pathname; die $pathname: $!\n unless @s; push @files, [$s[9], $pathname]; } @files = sort { $a-[0] = $b-[0] } @files; my $n = 0; foreach $f (@files) { $oldname = $f-[1]; do { $n++; $newname = sprintf %05d.png, $n; } while (-e $newname); print $oldname - $newname\n; rename $oldname, $newname or die $oldname: cannot rename to $newname ($!)\n; }' Ce programme n'est pas prévu pour être utilisé de façon incrémentale ; s'il est lancé plusieurs fois dans le même répertoire après ajout de nouveaux fichiers [0-9a-f]{32}.png, les numéros attribués aux nouveaux fichiers ne correspondront pas à l'ordre des mtime, sauf si le plus ancien fichier ajouté est plus récent que le plus récent fichier renommé dans la passe précédente. Donc, si on renomme les fichiers de décembre puis on ajoute les fichiers de novembre, pas la peine d'espérer que le script remettra tous les numéros dans l'ordre. -- André Majorel http://www.teaser.fr/~amajorel/ Thanks to the Debian project for going to such lengths never to disclose the email addresses of their users. Think of all the spam we would get if they didn't ! -- Lisez la FAQ de la liste avant de poser une question : http://wiki.debian.net/?DebianFrench Vous pouvez aussi ajouter le mot ``spam'' dans vos champs From et Reply-To: To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: renommer en lot
On 2008-01-29 19:37 +0100, Jack.R wrote: On Tue, 29 Jan 2008 15:05:43 +0100 Andre Majorel [EMAIL PROTECTED] wrote: Un petit script bash (non testé, donc travailler sur une copie des images) #!/bin/sh count=0 for item in `ls -t -r *.png` do mv $item `printf %06d $count`.png count=$(( $count + 1 )) done Il y a au moins un problème avec ce script ; la liste des fichiers à traiter doit tenir sur la ligne de commande. Je viens de faires des essais avec une trentaine de fichier dont les noms font environ 70 caractères, ls passe bien à la ligne mais cela fonctionne. Il faut essayer avec les 25000 qu'a le monsieur. :-) Cela cloche lorsqu'il y a des espaces dans le nom des fichiers à traiter. Oui, parce que le shell fait une passe de word splitting sur le résultat de l'expansion des backquotes. Je suis curieux et je n'ai pas compris ce que tu voulais dire. Peux-tu expliquer ? Sous Unix, il y a une limite à la longueur totale des arguments d'un process. Cette limite s'appelle ARG_MAX (limits.h) et sa valeur varie d'un système à l'autre. Sous Linux, elle était de 128 kB aux dernières nouvelles. SUS dit que ARG_MAX doit être supérieure ou égale à _POSIX_ARG_MAX, qui vaut 4 kB. Il n'est pas prudent de faire « for v in `truc` » ou « foo * » si on n'est pas sûr que l'expansion de « `truc` » ou « * » n'excèdera pas _POSIX_ARG_MAX. Il vaut mieux utiliser xargs ou, si on ne peut pas, « while read ». Dans le cas qui nous occupe, ls -t -r *.png | while IFS= read -r f do mv $f ... done Et attention : The number of bytes available for the new process' combined argument and environment lists is {ARG_MAX}. It is implementation-dependent whether null terminators, pointers, and/or any alignment bytes are included in this total. Donc, dans le cas le plus défavorable, 4 kB pour ARG_MAX, disons 1 kB d'environnement, des noms de fichiers de deux caractères, quatre octets par pointeur et un alignement à 16, on pourrait parfaitement être limité à (4096 - 1024) / (16 + 4) = 153 arguments ce qui correspond à 306 caractères. -- André Majorel http://www.teaser.fr/~amajorel/ The Debian project must be praised for their efforts in fighting spam by flooding spammers with email addresses, some of which are even bogus. -- Lisez la FAQ de la liste avant de poser une question : http://wiki.debian.net/?DebianFrench Vous pouvez aussi ajouter le mot ``spam'' dans vos champs From et Reply-To: To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: renommer en lot
On Tue, 29 Jan 2008 15:05:43 +0100 Andre Majorel [EMAIL PROTECTED] wrote: Un petit script bash (non testé, donc travailler sur une copie des images) #!/bin/sh count=0 for item in `ls -t -r *.png` do mv $item `printf %06d $count`.png count=$(( $count + 1 )) done Il y a au moins un problème avec ce script ; la liste des fichiers à traiter doit tenir sur la ligne de commande. Je viens de faires des essais avec une trentaine de fichier dont les noms font environ 70 caractères, ls passe bien à la ligne mais cela fonctionne. Cela cloche lorsqu'il y a des espaces dans le nom des fichiers à traiter. Je suis curieux et je n'ai pas compris ce que tu voulais dire. Peux-tu expliquer ? -- Jack.R
Re: renommer en lot
On Tue, 29 Jan 2008 22:24:21 +0100 Andre Majorel [EMAIL PROTECTED] wrote: On 2008-01-29 19:37 +0100, Jack.R wrote: Je suis curieux et je n'ai pas compris ce que tu voulais dire. Peux-tu expliquer ? [ .. explication claire et détaillée .. ] Merci beaucoup. -- Jack.R
Re: renommer en lot
Le lun 28 jan 2008 00:11:58 CET, Remys Morrissette [EMAIL PROTECTED] a écrit : Bonjour, j'ai une série de fichiers (+/- 25000) . que j'aimerais renommer de façon séquentiel dans le genre 1, 2, 3, , 25000 ou encore, 01, 02, 03, ..., a1, a2, a3, , e... avec l'ordre par date si possible. des idées ? Regarde le paquet « mmv » : Déplace/copie/ajoute/lie plusieurs fichiers mmv est un programme pour déplacer/copier/ajouter/lier plusieurs fichiers selon un jeu de motifs jokers. Toutes ces actions sont effectuées en toute sécurité, i.e. sans un effacement inexpliqué de fichiers dû à des collisions sur des noms de cibles avec des noms de fichiers existants ou avec d'autres noms de cibles. Fred.
Re: renommer en lot
Remys Morrissette a écrit : j'ai une série de fichiers (+/- 25000) ../.. que j'aimerais renommer de façon séquentiel dans le genre 1, 2, 3, , 25000 ou encore, 01, 02, 03, ..., a1, a2, a3, , e... avec l'ordre par date si possible. des idées ? Remys sudo apt-get install krename
renommer en lot
Bonjour, j'ai une série de fichiers (+/- 25000) exemple : 0bf153bfa73346bafd4035908ff3a4fb.png Wed Oct 24 00:16:57 2007 0bf30ca8b401ab42ad9adc8327ce8ac7.png Mon Sep 10 21:15:09 2007 acda647ce3d021a81e126f9ccc622139.png Tue May 22 21:17:32 2007 ace127012b35f74f29bf58a82268a98b.png Thu Apr 13 23:52:55 2006 e3e1602a552ffe15b446388239b9299d.png Sun Apr 15 22:36:11 2007 e3e3e4449d314d7abae0d1bba0acdc91.png Mon Sep 10 21:33:37 2007 que j'aimerais renommer de façon séquentiel dans le genre 1, 2, 3, , 25000 ou encore, 01, 02, 03, ..., a1, a2, a3, , e... avec l'ordre par date si possible. des idées ? Remys -- Lisez la FAQ de la liste avant de poser une question : http://wiki.debian.net/?DebianFrench Vous pouvez aussi ajouter le mot ``spam'' dans vos champs From et Reply-To: To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]
Re: renommer en lot
On Mon, 28 Jan 2008 00:11:58 -0500 Remys Morrissette [EMAIL PROTECTED] wrote: Bonjour, j'ai une série de fichiers (+/- 25000) exemple : 0bf153bfa73346bafd4035908ff3a4fb.png Wed Oct 24 00:16:57 2007 0bf30ca8b401ab42ad9adc8327ce8ac7.png Mon Sep 10 21:15:09 2007 acda647ce3d021a81e126f9ccc622139.png Tue May 22 21:17:32 2007 ace127012b35f74f29bf58a82268a98b.png Thu Apr 13 23:52:55 2006 e3e1602a552ffe15b446388239b9299d.png Sun Apr 15 22:36:11 2007 e3e3e4449d314d7abae0d1bba0acdc91.png Mon Sep 10 21:33:37 2007 que j'aimerais renommer de façon séquentiel dans le genre 1, 2, 3, , 25000 ou encore, 01, 02, 03, ..., a1, a2, a3, , e... avec l'ordre par date si possible. des idées ? Remys Bonjour, Un petit script bash (non testé, donc travailler sur une copie des images) #!/bin/sh count=0 for item in `ls -t -r *.png` do mv $item `printf %06d $count`.png count=$(( $count + 1 )) done -- Jack.R
Re: renommer en lot
Remys Morrissette wrote: Bonjour, j'ai une série de fichiers (+/- 25000) exemple : 0bf153bfa73346bafd4035908ff3a4fb.png Wed Oct 24 00:16:57 2007 0bf30ca8b401ab42ad9adc8327ce8ac7.png Mon Sep 10 21:15:09 2007 acda647ce3d021a81e126f9ccc622139.png Tue May 22 21:17:32 2007 ace127012b35f74f29bf58a82268a98b.png Thu Apr 13 23:52:55 2006 e3e1602a552ffe15b446388239b9299d.png Sun Apr 15 22:36:11 2007 e3e3e4449d314d7abae0d1bba0acdc91.png Mon Sep 10 21:33:37 2007 que j'aimerais renommer de façon séquentiel dans le genre 1, 2, 3, , 25000 ou encore, 01, 02, 03, ..., a1, a2, a3, , e... avec l'ordre par date si possible. des idées ? Il y a metamorphose http://file-folder-ren.sourceforge.net/ pour cela. Remys -- Lisez la FAQ de la liste avant de poser une question : http://wiki.debian.net/?DebianFrench Vous pouvez aussi ajouter le mot ``spam'' dans vos champs From et Reply-To: To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]