파일 확장자를 무시하고 단일 파일의 이름을 바꾸려면 rename 명령을 사용하십시오.

파일 확장자를 무시하고 단일 파일의 이름을 바꾸려면 rename 명령을 사용하십시오.

jpg 확장자를 가진 모든 파일의 이름이 변경됩니다.

rename 'y/a-z/A-Z/' *.jpg

이렇게 하면 파일 이름이 바뀌고 확장자 이름도 바뀌게 됩니다.

rename 'y/a-z/A-Z/' image.jpg

확장자를 변경하지 않고 단일 파일의 이름을 바꾸는 방법은 무엇입니까?

example.jpg

출력은 다음과 같아야 합니다.

EXAMPLE.jpg

답변1

그리고이름을 바꿔라

rename  -n 's/.*\./\U$&/'
  • -n논쟁은 변화를 일으키지 않고 무슨 일이 일어날지 알려주는 것입니다.
  • .*정규식 세계의 매개변수는 선택입니다.모든 것\., 선택 지점 이전의 모든 것[.] ⇾ .*\.선택 지점 이전의 모든 것과 함께 사용됩니다 .
    • [점]이 포함되어 있으므로 \문자를 이스케이프하려면 [백슬래시]를 사용하세요 ..정규식.
  • \U인수는 대문자화를 의미합니다.이스케이프 시퀀스Perl 정규식에서는 \[백슬래시]와 함께 사용해야 합니다.
  • $&마지막으로 성공한 패턴 검색에서 일치하는 문자열을 찾는 데 사용되는 매개변수입니다. 반환 예시 /find/$&ADD/: findADD
반품:
rename(fellowSHIP.jpg, FELLOWSHIP.jpg)
rename(retorno2.jpg, RETORNO2.jpg)
rename(retorno3.jpg, RETORNO3.jpg)
rename(retorno4.jpg, RETORNO4.jpg)
rename(shein1.jpg, SHEIN1.jpg)
rename(shein2.jpg, SHEIN2.jpg)
rename(shein3.jpg, SHEIN3.jpg)
rename(shein4.jpg, SHEIN4.jpg)
rename(shein-girl1.jpg, SHEIN-GIRL1.jpg)
rename(sheingirl2.jpg, SHEINGIRL2.jpg)
rename(twoTowers1.jpg, TWOTOWERS1.jpg)
rename(twoTowers2.jpg, TWOTOWERS2.jpg)
rename(twoTowers3.jpg, TWOTOWERS3.jpg)
rename(twoTowers4.jpg, TWOTOWERS4.jpg)
rename(twoTowers5.jpg, TWOTOWERS5.jpg)
rename(twoTowers6.jpg, TWOTOWERS6.jpg)


답변2

rename 's/(.*)(\.[^.]+)/\U$1\E$2/' example.jpg
  • s/교체 시작
  • (.*)첫 번째 그룹에 캡처된 접미사(모든 문자, 숫자) 앞의 파일 이름 부분과 일치합니다.
  • (\.[^.]+)두 번째 그룹에 캡처된 접미사 a .뒤에 하나 이상의 비 문자가 오는 것과 일치합니다..
  • /교체 시작
  • \U대문자 (~까지 \E)
  • $1첫 번째로 일치하는 그룹 삽입
  • \E최종 상황 수정
  • $2두 번째 일치 그룹 삽입
  • /터미널 대체

답변3

( 의 관련성이 없고 매우 제한된 것 외에도 ) 이제 perl 명령의 util-linux몇 가지 변형이 있습니다 (원래는renameperl3.0에 포함된 매우 짧은 예제 스크립트).

와 함께https://metacpan.org/dist/File-Rename그리고 Debian 기반 시스템의 최신 패키지에서 rename모든 파일 이름의 모든 ASCII 문자를 대문자로 변환하지만 확장자(있는 경우)는 변환하지 않으려면 다음을 수행할 수 있습니다.

rename -d -- 's/.*\.|.*/\U$&/s' "$file"

어디:

  • -d파일의 디렉터리 이름이 영향을 받지 않는지 확인하세요.
  • --이 구현에서는 $file시작을 -옵션으로 취해야 합니다( --e=exec("rm -rf ~")예를 들어 호출된 파일에 대해 비참한 결과가 발생함).
  • 대체 플래그가 필요합니다 s. 그렇지 않으면 개행(파일 이름의 모든 문자만큼 유효한 문자)이 일치하지 않습니다.s.
  • .*\.|.*가장 오른쪽에 있는 항목 .(예: .*탐욕) 또는 모든 항목과 일치합니다. perl왼쪽 패턴이 먼저 시도되고 POSIX 정규 표현식과 달리 다른 패턴이 더 긴 일치 항목을 생성하는지 확인하려는 시도가 수행되지 않는다는 점을 기억합니다. 따라서 확장자가 있는 파일의 경우 확장자 앞의 내용과 일치하고, 확장자가 없는 파일의 경우 전체 파일 이름과 일치합니다.
  • $&일치하는 내용입니다. 접두사로 사용하면 / 에서 빌려온 \U것처럼 대문자로 변환됩니다 .exviperl

-n(시험 실행용):

$ rename -n -d -- 's/.*\.|.*/\U$&/s' $'--e=system("echo reboot") #/foo\nbar.jpg'
rename(--e=system("echo reboot") #/foo
bar.jpg, --e=system("echo reboot") #/FOO
BAR.jpg)
$ rename -n -d -- 's/.*\.|.*/\U$&/s' .config/gtkrc
rename(.config/gtkrc, .config/GTKRC)
$ rename -n -d -- 's/.*\.|.*/\U$&/s' .bashrc
$

( .bashrc여기서는 bashrc확장으로 간주됩니다).

이제 한 가지 문제는 ASCII 파일 이름에서만 작동한다는 것입니다.

예 를 들어 UTF - 8 Stéphane.jpgSTéPHANE.jpg.STÉPHANE.jpgéStéphane.jpgSt<U+F310>phane.jpg

이 문제를 해결하는 rename것은 약간의 고통입니다. 다음과 같은 것이 필요합니다.

rename -n  -d -- '
  use Encode::Locale;
  use Encode;

  $_ = decode(locale_fs => $_);
  s/.*\.|.*/\U$&/s;
  $_ = encode(locale_fs => $_)' "$file"

로케일의 문자 세트를 사용하여 인코딩된 것처럼 파일을 처리합니다.

그러나 문자로 디코딩할 수 없는 바이트를 일부 대체 문자로 변환합니다(로케일과 유사 ?하거나 로케일에 따라 다름. C 로케일에서는 127 이상의 모든 바이트 값이 포함됨).

마지막으로, 쉘의 연산자를 사용하는 것이 더 쉽고 안전할 수 있습니다. 그림 zsh:

case $file:t in
  (*.*) newfile=$file:h/$file:t:r:u.$file:e;;
  (*) newfile=$file:h/$file:t:u;;
esac
[[ $file = $newfile ]] || mv -i -- $file $newfile

(그 중에는 csh :t스타일 수정자가 있으며 각각 ail , ead, ootname, xtension 및 Turn을 ppercase로 생성 합니다 .):h:r:e:uthreu

zsh연산자는 최선의 노력을 다할 것입니다. 즉, 디코딩할 수 없는 바이트 시퀀스를 남겨두고 디코딩할 수 있는 문자를 변환합니다.

zshzmv자동 로드 기능으로 구현된 자체 내장 일괄 이름 바꾸기 도구도 있습니다.

autoload -Uz zmv # best in ~/.zshrc
zmv '(*).(*)' '$1:u.$2'

(숨겨지지 않은 파일의 이름을 확장자로만 바꿉니다)

zmv이름 바꾸기를 시작하기 전에 몇 가지 온전성 검사도 수행되어 rename.

관련 정보