Renommer plusieurs fichiers avec 2 conditions / remplacements sur une seule ligne?


8

J'essaie de renommer quelques images:

IMG_1.JPG
IMG_2.JPG
IMG_3.JPG

Je veux remplacer IMGpar imget .JPGpar .jpg- je sais comment faire la deuxième partie:

$ rename 's/\.JPG$/\.jpg/' *.JPG

Mon problème est que je n'arrive pas mv IMG_.JPGà img_.jpg- je sais que vous pouvez passer plusieurs modèles à rename, mais je n'arrive pas à utiliser le nom de fichier existant avec une valeur minuscule modifiée.

Comment dois-je procéder?

Réponses:


10

Vous devez peut-être utiliser la commande perl rename. Sur ma boîte CentOS, cela s'appelle «prename».

$ ls
IMG_1.JPG  IMG_2.JPG  IMG_3.JPG
$ prename 's/^IMG/img/;s/\.JPG$/\.jpg/' *JPG
$ ls
img_1.jpg  img_2.jpg  img_3.jpg
$

$ prename -h
Usage: prename [OPTION]... PERLEXPR FILE...
Rename FILE(s) using PERLEXPR on each filename.

  -b, --backup                  make backup before removal
  -B, --prefix=SUFFIX           set backup filename prefix
  -f, --force                   remove existing destinations, never prompt
  -i, --interactive             prompt before overwrite
  -l, --link-only               link file instead of reame
  -n, --just-print, --dry-run   don't rename, implies --verbose
  -v, --verbose                 explain what is being done
  -V, --version-control=METHOD  override the usual version control
  -Y, --basename-prefix=PREFIX  set backup filename basename prefix
  -z, -S, --suffix=SUFFIX       set backup filename suffix
      --help                    display this help and exit
      --version                 output version information and exit

The backup suffix is ~, unless set with SIMPLE_BACKUP_SUFFIX.  The
version control may be set with VERSION_CONTROL, values are:

  numbered, t     make numbered backups
  existing, nil   numbered if numbered backups exist, simple otherwise
  simple, never   always make simple backups

Report bugs to pederst@cpan.org
$

Si vous souhaitez utiliser la renamecommande dumb de util-linux(parfois appelée rename.ul), il faut peut-être la faire en deux étapes, par exemple

$ ls
IMG_1.JPG  IMG_2.JPG  IMG_3.JPG
$ rename IMG img *JPG
$ rename JPG jpg *JPG
$ ls
img_1.jpg  img_2.jpg  img_3.jpg
$

3
Notez que le fait perl renameprécéder le stupide renametrouvé dans util-linux que vous appelez plain oldrename . Il est même antérieur à Linux.
Stéphane Chazelas

6

Pour répondre à votre question dans le générique,

renommer plusieurs fichiers avec 2 conditions / remplacements sur une seule ligne?

vous utiliseriez généralement des groupes de capture , en vous référant à eux dans l'expression de remplacement en utilisant leurs références arrières correspondantes . Par exemple

$ rename -n 's/^(.*)_(.*)\.JPG$/\L$1_$2.jpg/' *.JPG
rename(IMG_2.JPG, img_2.jpg)
rename(IMG_3.JPG, img_3.jpg)

Cependant, dans ce cas particulier, il serait plus simple d'appliquer simplement le modificateur minuscule \Lau nom entier:

$ rename -n 's/.*/\L$&/' *.JPG
rename(IMG_2.JPG, img_2.jpg)
rename(IMG_3.JPG, img_3.jpg)

Une autre alternative, en utilisant mmv

$ mmv -n '*.JPG' '#l1.jpg'
IMG_2.JPG -> img_2.jpg
IMG_3.JPG -> img_3.jpg

(supprimez le -npour effectuer le renommage).


Ou bien zmv:zmv '*.JPG' '${(L)f}'
Stéphane Chazelas

1
Une version plus simple de rename 's/.*/\L$&/' *.JPGseraitrename '$_ = lc' *.JPG
hobbs

2

En utilisant mv:

compatible sh:

for file in *.JPG; do mv "$file" "$(echo "$file" | tr '[:upper:]' '[:lower:]')"; done

bash (Merci steeldriver):

for file in *.JPG; do mv "$file" "${file,,}"; done

Cela va parcourir tous les .JPGfichiers du répertoire en cours et les renommer avec le même nom avec tous les caractères majuscules convertis en caractères minuscules.


1

La manière la plus simple et basée sur la page de manuel qui ne couvre pas une expression régulière :

rename 'IMG' 'img' * ; rename 'JPG' 'jpg' *

À mon humble avis, une réponse simple comme celle-ci réalise ce que les coups lourds échouent parfois. Pas de méchanceté envers les programmeurs chevronnés, mais comme la question semble provenir d'un débutant, la simplicité doit être encouragée.
Hopping Bunny
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.