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?

treyBake
la source

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 [email protected]
$

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
$
Steve
la source
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).

tournevis
la source
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.

jesse_b
la source
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' *
Hossein Vatani
la source
À 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