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
몇 가지 변형이 있습니다 (원래는rename
perl
3.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
것처럼 대문자로 변환됩니다 .ex
vi
perl
예 -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.jpg
을 STéPHANE.jpg
.STÉPHANE.jpg
é
Stéphane.jpg
St<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
:u
t
h
r
e
u
zsh
연산자는 최선의 노력을 다할 것입니다. 즉, 디코딩할 수 없는 바이트 시퀀스를 남겨두고 디코딩할 수 있는 문자를 변환합니다.
zsh
zmv
자동 로드 기능으로 구현된 자체 내장 일괄 이름 바꾸기 도구도 있습니다.
autoload -Uz zmv # best in ~/.zshrc
zmv '(*).(*)' '$1:u.$2'
(숨겨지지 않은 파일의 이름을 확장자로만 바꿉니다)
zmv
이름 바꾸기를 시작하기 전에 몇 가지 온전성 검사도 수행되어 rename
.