在一行中用2个条件/替换重命名多个文件?


8

我正在尝试重命名一些图像:

IMG_1.JPG
IMG_2.JPG
IMG_3.JPG

我想,以取代IMGimg.JPG.jpg-我知道该怎么做第二部分:

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

我的问题是,我似乎无法这样mv IMG_.JPGimg_.jpg-我知道您可以将多个模式传递给rename,但是我似乎无法使用带有修改后的小写字母值的现有文件名。

我该怎么办?

Answers:


10

也许您需要使用perl重命名命令。在我的CentOS盒子上,它叫做“ 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
$

如果您要使用rename来自util-linux(有时称为rename.ul)的dumb 命令,则可能需要分两个步骤进行操作,例如

$ 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
请注意,它perl rename早于rename在util-linux中找到的哑巴(您称其为plain old)rename。它甚至早于Linux。
斯特凡Chazelas

6

为了回答您的疑问,

在一行中使用2个条件/替换来重命名多个文件?

您通常会使用捕获组,并在捕获表达式中使用它们相应的反向引用对其进行引用。例如

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

但是,在这种特殊情况下,将小写修饰符\L应用于整个名称会更简单:

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

另一种选择,使用 mmv

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

(删除-n以实际执行重命名)。


zmv“S:zmv '*.JPG' '${(L)f}'
斯特凡Chazelas

1
一个更简单的版本rename 's/.*/\L$&/' *.JPGrename '$_ = lc' *.JPG
hobbs,

2

使用mv

sh兼容:

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

bash(感谢steeldriver):

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

这将循环遍历.JPG当前目录中的所有文件,并将它们重命名为相同的名称,并将所有大写字符转换为小写字符。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.