Đổi tên nhiều tệp với 2 điều kiện / thay thế trong một dòng?


8

Tôi đang cố gắng đổi tên một vài hình ảnh:

IMG_1.JPG
IMG_2.JPG
IMG_3.JPG

Tôi muốn thay thế IMGbằng img.JPGbằng .jpg- Tôi biết cách thực hiện phần thứ hai:

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

Vấn đề của tôi là tôi dường như không thể mv IMG_.JPGđể img_.jpg- Tôi biết bạn có thể vượt qua nhiều mẫu để rename, nhưng tôi dường như không thể sử dụng tên tập tin hiện có với một giá trị thường được sửa đổi.

Làm thế nào để tôi đi về điều này?

Câu trả lời:


10

Có lẽ bạn cần phải sử dụng lệnh đổi tên perl. Trên hộp CentOS của tôi, nó được gọi là '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
$

Nếu bạn muốn sử dụng renamelệnh câm từ util-linux(đôi khi được gọi rename.ul), có lẽ cần thực hiện theo hai bước, ví dụ:

$ 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
Lưu ý rằng tiền perl renamethân renameđược tìm thấy trong linux-linux mà bạn gọi là đơn giảnrename . Nó thậm chí còn có trước Linux.
Stéphane Chazelas

6

Để trả lời bạn câu hỏi chung chung,

đổi tên nhiều tập tin với 2 điều kiện / thay thế trong một dòng?

bạn thường sẽ sử dụng nhóm chụp , đề cập đến chúng trong các biểu hiện thay thế sử dụng tương ứng của họ backreferences . Ví dụ

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

Tuy nhiên, trong trường hợp cụ thể này, sẽ đơn giản hơn khi chỉ áp dụng công cụ sửa đổi chữ thường \Lcho toàn bộ tên:

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

Một cách khác, sử dụng mmv

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

(loại bỏ -nđể thực sự đổi tên).


Hoặc zmvlà:zmv '*.JPG' '${(L)f}'
Stéphane Chazelas

1
Một phiên bản đơn giản hơn rename 's/.*/\L$&/' *.JPGsẽ làrename '$_ = lc' *.JPG
hobbs 27/07/18

2

Sử dụng mv:

sh tương thích:

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

bash (Cảm ơn thép thép):

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

Điều này sẽ lặp qua tất cả .JPGcác tệp trong thư mục hiện tại và đổi tên chúng thành cùng tên với tất cả các ký tự chữ hoa được chuyển đổi thành ký tự chữ thường.


1

Cách đơn giản nhất và dựa trên trang man không bao gồm biểu thức chính quy :

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

IMHO, một câu trả lời đơn giản như thế này đạt được những gì mà cú đánh nặng nề đôi khi không thành công. Không có ác ý đối với các lập trình viên dày dạn kinh nghiệm, nhưng vì câu hỏi dường như là từ một người mới, nên sự đơn giản cần được khuyến khích.
Nhảy Bunny
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.