한 줄에 2개의 조건/교체를 사용하여 여러 파일의 이름을 바꾸시겠습니까?

한 줄에 2개의 조건/교체를 사용하여 여러 파일의 이름을 바꾸시겠습니까?

일부 이미지의 이름을 바꾸려고 합니다.

IMG_1.JPG
IMG_2.JPG
IMG_3.JPG

나는 and IMG로 대체하고 싶습니다 . - 두 번째 부분을 수행하는 방법을 알고 있습니다.img.JPG.jpg

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

내 문제는 그럴 수 없다는 것입니다 mv IMG_.JPG. img_.jpg여러 패턴을 에 전달할 수 있다는 것을 알고 있지만 rename수정된 소문자 값이 있는 기존 파일 이름을 사용할 수 없는 것 같습니다.

나는 무엇을 해야 합니까?

답변1

Perl rename 명령을 사용해야 할 수도 있습니다. 내 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 [email protected]
$

(때때로 호출되는 ) rename의 멍청한 명령을 사용하려면 두 단계를 거쳐야 할 수도 있습니다.util-linuxrename.ul

$ 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
$

답변2

귀하의 질문에 일반적으로 답변하려면,

한 줄에 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실제로 이름 바꾸기를 수행하려면 삭제하십시오).

답변3

사용 mv:

sh 호환 가능:

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

bash (스틸드라이버에게 감사드립니다):

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

그러면 현재 디렉터리의 모든 파일을 반복 .JPG하여 이름을 같은 이름으로 바꾸고 모든 대문자를 소문자로 변환합니다.

답변4

가장 간단한 방법과 기반매뉴얼 페이지포함되지정규식:

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

관련 정보