Rechercher : dans
Par :

Rename ?

Dernière réponse le 17 jan 2009 à 22:33:03 eZula, le 27 sep 2008 à 16:31:06 
 Signaler ce message aux modérateurs

Bonjour,

je n'avais pas eu l'occasion de toucher la commande rename sous shell bash, pour une opération tout ce qu'il y a de plus trivial :

rename REP1.txt REP.txt


ça ne donne rien du tout (même pas un msg d'erreur). J'ai alors cherché un peu sur google et n'ai trouvé que des combinaisons compliquées avec des "mv $i" et bien pire encore. La tournure intuitive de la commande ci-dessus serait-elle teintée de naïveté ?

Merci

PS : rename (util-linux-ng 2.13.1)
Configuration: Linux Suse
Firefox 3.0.2

Meilleures réponses pour « rename ? » dans :
Télécharger Renamer4Mac Voir Renamer4Mac permet de renommer facilement un grand nombre de fichiers. Par un simple glisser/déposer des fichiers sur son icône ou dans sa fenêtre, on peut agir de différentes manières. par Rechercher/Remplacer (expression régulière et...
Télécharger Lupas Rename Voir Lupas Rename est un programme permettant de renommer plusieurs fichiers à la fois. Les fonctionnalités de ce logiciel sont les suivantes : Renommer des fichiers ou répertoires Renommer des fichiers dans les sous-répertoires récursifs ...
Renommer plusieurs fichiers en batch VoirLe fait de renommer un grand nombre de fichiers peut très vite devenir fastidieux. Heureusement, il existe des outils permettant d'automatiser cette tâche dans un grand nombre de cas : Fonctionnalités natives Utilisation d'un programme...
Télécharger Ant Renamer VoirANT Renamer permet de renommer un grand nombre de fichiers et dossiers en quelques clics. Il ne fait que modifier les noms des fichiers/dossiers : Changement d'extension Remplacement de chaînes de caractères par d'autres Insertion d'une chaîne...
Télécharger The rename VoirTHE Rename est un logiciel gratuit permettant de renommer des fichiers en masse avec un grand nombre de possiblités et d'options. Fonctionnalités renommer une série de fichiers avec un compteur : pict0001.jpg, pict0002.jpg, pict0003.jpg... ...
Télécharger Bulk rename utility VoirBulk Rename Utility est un programme conçu pour renommer plusieurs fichiers simultanément. Sa conception se base sur des recommandations et suggestions d'utilisateurs. L'application propose notamment : - de renommer des fichiers ou des dossiers, -...
SQL - Modification de table VoirModification de table Il est possible de supprimer une table grâce à la clause DROP, il existe aussi des commandes moins extrêmes permettant L'ajout de colonnes La modification de colonnes La suppression de colonnes Enfin, il est possible...

1

jeanbi, le 27 sep 2008 à 16:37:08

Bonjour,
man rename
rename - Renommer plusieurs fichiers

SYNOPSIS
rename [ -v ] perlexpr [ fichiers ]

DESCRIPTION
"rename" renomme les fichiers en accord avec la règle spécifiée comme
premier argument. L’argument perlexpr est une expression Perl qui va
modifier la chaine Perl "$_" pour au moins un des fichiers spécifiés.
Si un nom de fichier donné n’est pas modifié par l’expression, il ne
sera pas renommé. Si aucun nom de fichier n’est fourni, la liste des
fichiers sera lue sur l’entrée standard.

Par exemple, pour renommer tous les fichiers correspondant à "*.bak" de
manière à retirer leur extension, vous pouvez faire

rename ’s/\e.bak$//’ *.bak

Pour convertir les majuscules en minuscules, vous feriez

rename ’y/A-Z/a-z/’ *

a+ FC 9 - Mandriva 2008.1 -Debian 4.0-
Les meilleures choses ont besoin de patience.(JC ANGLADE)

Répondre à jeanbi

3

eZula, le 27 sep 2008 à 16:42:37

Merci, mais voici ma manpage de rename :

RENAME(1) Linux Programmer's Manual RENAME(1)
NAME
rename - Rename files
SYNOPSIS
rename from to file...
rename -V
DESCRIPTION
rename will rename the specified files by replacing the first occurrence of from in their name by to.
-V, --version
Display version information and exit.

For example, given the files
foo1, ..., foo9, foo10, ..., foo278, the commands

rename foo foo0 foo?
rename foo foo0 foo??

will turn them into foo001, ..., foo009, foo010, ..., foo278.

And
rename .htm .html *.htm

will fix the extension of your html files.

SEE ALSO
mmv(1), mv(1)

AVAILABILITY
The rename command is part of the util-linux-ng package and is avail-
able from ftp://ftp.kernel.org/pub/linux/utils/util-linux-ng/.

1 January 2000 RENAME(1)


j'en ai déduit qu'un simple rename fichier fichier2 pourrait suffire, ou a la rigueur rename from fichier to fichier2, mais non.

Heu c'est vraiment très con ce que je cherche à faire, renommer un simple fichier. La perlexpr est-elle une fatalité ? comment expliquer le décalage entre la description de la manpage ci-dessus et la complexité de l'opération que tu décris ?

Répondre à eZula

4

lami20j, le 27 sep 2008 à 16:46:28

Re,

pour remplacer REP1.txt avec REP.txt il suffit de supprimer 1 (en fait de le remplacer avec rien plutôt)

lami20j@debian:~$ touch REP1.txt
lami20j@debian:~$ ls -l REP1.txt
-rw-r--r-- 1 lami20j lami20j 0 2008-09-27 16:44 REP1.txt
lami20j@debian:~$ rename 's/1//' REP1.txt
lami20j@debian:~$ ls -l REP1.txt
ls: REP1.txt: Aucun fichier ou répertoire de ce type
lami20j@debian:~$ ls -l REP.txt
-rw-r--r-- 1 lami20j lami20j 0 2008-09-27 16:44 REP.txt
lami20j@debian:~$

106485010510997108

Répondre à lami20j

5

lami20j, le 27 sep 2008 à 16:47:53

Re,

Heu c'est vraiment très con ce que je cherche à faire, renommer un simple fichier

en ce cas pourquoi pas

mv REP1.txt REP.txt
106485010510997108

Répondre à lami20j

6

eZula, le 27 sep 2008 à 16:55:00

La deuxième solution fonctionne.
La première non, exemple : remplacer REP2.txt par REP3.txt

~/Desktop/compt> ls
REP1.txt  REP2.txt  REP.txt  URL1.txt  URL2.txt  URL.txt

rename 's/2/3/' REP2.txt && ls
REP1.txt  REP2.txt  REP.txt  URL1.txt  URL2.txt  URL.txt


tu utilises quelle version de rename ?

Répondre à eZula

7

lami20j, le 27 sep 2008 à 16:59:21

Voici chez moi

lami20j@debian:~/eZula$ touch REP1.txt  REP2.txt  REP.txt  URL1.txt  URL2.txt  URL.txt
lami20j@debian:~/eZula$ ls -l
total 0
-rw-r--r-- 1 lami20j lami20j 0 2008-09-27 16:56 REP1.txt
-rw-r--r-- 1 lami20j lami20j 0 2008-09-27 16:56 REP2.txt
-rw-r--r-- 1 lami20j lami20j 0 2008-09-27 16:56 REP.txt
-rw-r--r-- 1 lami20j lami20j 0 2008-09-27 16:56 URL1.txt
-rw-r--r-- 1 lami20j lami20j 0 2008-09-27 16:56 URL2.txt
-rw-r--r-- 1 lami20j lami20j 0 2008-09-27 16:56 URL.txt
lami20j@debian:~/eZula$ rename 's/2/3/' REP2.txt && ls
REP1.txt  REP3.txt  REP.txt  URL1.txt  URL2.txt  URL.txt


Mon rename est la fonction de perl 5.8.8

RENAME(1)                                                                       Perl Programmers Reference Guide                                                                      RENAME(1)

NAME
       rename - renames multiple files

SYNOPSIS
       rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]

DESCRIPTION
       "rename" renames the filenames supplied according to the rule specified as the first argument.  The perlexpr argument is a Perl expression which is expected to modify the $_ string in
       Perl for at least some of the filenames specified.  If a given filename is not modified by the expression, it will not be renamed.  If no filenames are given on the command line, file-
       names will be read via standard input.

       For example, to rename all files matching "*.bak" to strip the extension, you might say

               rename 's/\.bak$//' *.bak

       To translate uppercase names to lower, you'd use

               rename 'y/A-Z/a-z/' *

OPTIONS
       -v, --verbose
               Verbose: print names of files successfully renamed.

       -n, --no-act
               No Action: show what files would have been renamed.

       -f, --force
               Force: overwrite existing files.

ENVIRONMENT
       No environment variables are used.

AUTHOR
       Larry Wall

SEE ALSO
       mv(1), perl(1)

DIAGNOSTICS
       If you give an invalid Perl expression you'll get a syntax error.

BUGS
       The original "rename" did not check for the existence of target filenames, so had to be used with care.  I hope I've fixed that (Robin Barker).

perl v5.8.8                                                                                2008-04-25                                                                                 RENAME(1)
 Manual page rename(1) line 1/51 (END)          

106485010510997108

Répondre à lami20j

8

eZula, le 27 sep 2008 à 17:09:53

Conclusion : ça marche chez toi et surtout nous n'utilisons pas la même version (la tienne est plus récente et plus avancée)
Je reste un peu sur ma faim, bien que ta deuxième solution soit la plus probablement retenue, car je ne comprends pas pourquoi mon test initial ne fonctionne pas au regard du manpage de cette version util-linux-ng 2.13.1

Répondre à eZula

9

lami20j, le 27 sep 2008 à 17:43:45

Re,

dans ton cas tu dois faire

rename '2.txt' '3.txt' REP2.txt && ls
106485010510997108

Répondre à lami20j

10

lami20j, le 27 sep 2008 à 17:47:22

Pour ton test initial il faut écrire

rename '1.txt' '.txt'  REP1.txt
Dans ton man rename

rename from to file...

ce qui veut dire que
from c'est '1.txt'
to c'est '.txt'

donc tu modifies la partie from par la partie to de ton fichier REP1.txt
ce qui donne REP.txt

106485010510997108

Répondre à lami20j

11

eZula, le 27 sep 2008 à 17:56:38

Exact, bien vu ;)

Merci lami20j

Répondre à eZula

12

eZula, le 27 sep 2008 à 19:27:46

Mince, là je suis bien embêté avec un pb que j'ai sous-estimé.
Dans un dossier compt, il y a ces fichiers

~/Desktop/compt> ls
Compteur.txt
REP1.txt
REP2.txt


Le fichier Compteur.txt contient simplement le caractère 2

Le but de la manip est :
- initialiser un compteur compt à la valeur du contenu du fichier Compteur.txt (càd 2)
- par pas de 1 décrémenter ce compteur et renommer les fichiers REP$compt .txt en rep(compt -1).txt
jusqu'à ce que $compt=0

Donc en gros :

REP1.txt -> devient REP0.txt
REP2.txt -> devient REP1.txt

et stop

donc

compt=$(cat Compteur.txt)
for i in `seq $compt` ; do j=$(( $compt - 1 ));rename "$compt" "$j" REP$compt.txt ; done


ça me parait bien cradasse comme code, sans compter que ça ne marche pas. J'ai essayé d'inverser la séquence en utilisant | tac mais c'est pas mieux. Pareil avec les guillemets ou simple ' ça ne change rien. Je me suis perdu avec une boucle while (la condition était : "tant que le compteur est strictement supérieur à zéro, décrémenter ce compteur et renommer" - pour l'arrêt de la boucle).

Comment procèderiez-vous proprement pour arriver au résultat attendu ?

Répondre à eZula

13

lami20j, le 27 sep 2008 à 19:58:53

Re,

for i in $(seq $(cat Compteur.txt));do rename "$i.txt" "$(($i-1)).txt" REP*;done
106485010510997108

Répondre à lami20j

14

jipicy, le 27 sep 2008 à 20:22:21

Salut,

[eZula]$ ls
foo.sh*  REP1.txt  REP2.txt  REP3.txt  REP4.txt

[eZula]$ cat foo.sh
#! /bin/bash

for i in REP*
do
number=$(grep -o '[ [:digit:]]' <<<$i)
mv ${i} ${i/$number/$(($number -1))}
done

[eZula]$ ./foo.sh

[eZula]$ ls
foo.sh*  REP0.txt  REP1.txt  REP2.txt  REP3.txt

[eZula]$  
L'espace entre les crochets ouvrant de :digit: est à enlevé, c'est à cause de la mise en forme de la balise code se CCM.

;-))
$ man woman
Il n'y a pas de page de manuel pour woman.

Répondre à jipicy

15

lami20j, le 27 sep 2008 à 20:34:52

Salut,

je n'ai pas utilisé mv puisqu'en fait il voulait avec rename du Suse qui est un peu différent par rapport à ce que j'ai par exemple sur Debian ;-))

sinon avec mv ;-))

$ ls -1
Compteur.txt
REP1.txt
REP2.txt
$ for i in $(seq $(cat Compteur.txt));do mv "REP$i.txt" "REP$(($i-1)).txt";done
$ ls -1
Compteur.txt
REP0.txt
REP1.txt

106485010510997108

Répondre à lami20j

16

eZula, le 28 sep 2008 à 10:27:49

Salut,

Après réflexion la solution de jipicy a été retenue car cette histoire de compteur n'est au final pas très pratique pour la suite, voire peut être même inutile.

Donc merci à vous deux

Répondre à eZula

17

 lami20j, le 28 sep 2008 à 10:35:36

Salut,

de toute façon les 3 solutions font exactement la même chose ;-) 106485010510997108

Répondre à lami20j