정말 엉망이군요. Perl이 이름 바꾸기를 위해 sed와 유사한 구문을 사용할 것으로 예상할 때 , 다양한 구현이 있고 대부분의 경우 Perl의 다른 버전(바이너리) s///
이 있을 때 어떤 명령을 사용해야 하는지 어떻게 알 수 있습니까 ?rename
rename.ul
답변1
진주의rename
파일 이름을 일괄적으로 바꾸는 가장 잘 알려져 있고 가장 직관적인 도구는 Perl입니다 rename
. 이는 스테로이드와 매우 유사합니다 sed
(파일 이름 바꾸기용).
긴 이야기 짧게
예상대로 사용하려면 Perl의 CPAN을 사용하여 예상 버전을 설치하는 것이 가장 좋습니다. 정말 많은 버전이 있습니다.
아래의 "일반 Perl CPAN 설치"를 참조하십시오.
사용법( sed
s///
예)
강력한 정규식 처리가 가능합니다.
rename [options] 's/<regex>/<replacement>/[modifiers]' <FILE(S)>[*]
<STDIN> | rename [options] 's/<regex>/<replacement>/[modifiers]'
예
TitleCase
mp4 파일 이름의 각 단어 사이에 공백을 추가 하려면 (PascalCase
도착하다공백으로 구분된 단어):rename -n 's/\B[[:upper:]]/ $&/g' ./*.mp4 rename(./FooBarBaz.mp4, ./Foo Bar Baz.mp4)
시도가 만족스러운 경우
-n
스위치를 제거하십시오 .dry-run
실제 이름으로 변경.제로 패딩에 수정자를 사용하는
replacement
것처럼 해당 섹션에 호출을 삽입 할 수도 있습니다 .sprintf "%03d", 7
e
$ touch {1..3}.txt $ rename -n 's/(\d+)\.txt/sprintf "%03d", $1/e' ./*.txt rename(1.txt, 001.txt) rename(2.txt, 002.txt) rename(3.txt, 003.txt)
-
구분된 텍스트의 역순을 사용하여캡처 그룹:$ rename -n 's/(\w+)-(\w+)-(\w+)/$3-$2-$1/' ./foo-bar-base.txt rename(foo-bar-base.txt, base-bar-foo.txt)
또는
Perl
이와 같은 것을 사용하십시오 (TMTOWTDI):$ rename -n 's/(\w+)-(\w+)-(\w+) # capture groups /join "-", reverse @{^CAPTURE}/xe' foo-bar-base.txt rename(foo-bar-base.txt, base-bar-foo.txt)
Perl을 마스터하는 데 시간을 투자할 가치가 있습니다. 그러나 rename 명령의 시간 절약 기능을 사용하기 시작하려면 기능, 단순성 및 시간 측면에서 큰 이점을 얻기 위해 Perl에 대해 많이 알 필요가 없습니다.
자신의 버전을 확인하세요
같은 이름의 또 다른 바이너리 도구도 일부 배포판에서 사용됩니다. 배포판에 따라 Perl 버전은 perl-rename
, file-rename
, prename
,pname
또는 rename
.
아직 하나 있어요파이썬rename
차장이 거기 있어요!
rename --version
다음과 같아야 합니다.
/usr/bin/rename using File::Rename version 1.30, File::Rename::Options version 1.10
또는 이전 버전의 경우:
Unknown option: help
Usage: rename [-v] [-n] [-f] perlexpr [filenames
또는
rename 2>&1 | grep -i perl
[ -e|-E perlexpr]*|perlexpr [ files ]
뭔가를 사용하는 대신 rename
~에서util-linux
이름 바꾸기 명령의 기본 버전 및 릴리스 테이블
다음에서 빌림tldr-pages용 GitHub 문제 추적기에 대한 @mebeim의 의견:
진주(구) 펄(신규) 펄(다른?) 씨 리눅스(데비안) 이름(pkg perl), 더 이상 사용되지 않음 파일 이름 바꾸기(패키지 이름 바꾸기) 해당 없음 rename.ul(pkg util-linux) 리눅스(우분투) 해당 없음 파일 이름 바꾸기(패키지 이름 바꾸기) 해당 없음 rename.ul(pkg util-linux) 리눅스(아키텍처) 해당 없음 해당 없음 펄 이름 바꾸기(pkg 펄 이름 바꾸기) 이름 바꾸기(pkg util-linux) 리눅스(CentOS, RHEL) 해당 없음 해당 없음 해당 없음 이름 바꾸기(pkg util-linux) 리눅스(페도라) 해당 없음 해당 없음 이름(패키지 이름) 이름 바꾸기(pkg util-linux) 리눅스(오픈수세) 해당 없음 해당 없음 해당 없음 이름 바꾸기(pkg util-linux) macOS(수제) 해당 없음 해당 없음 이름 바꾸기(패키지 이름 바꾸기) 이름 바꾸기(pkg util-linux) 윈도우 해당 없음 해당 없음 해당 없음 해당 없음 솔라리스 해당 없음 해당 없음 해당 없음 해당 없음
중요 사항:
Windows에서는
rename
완전히 다른 명령이지만(그래서 위에 나열하지 않았습니다) 역시 작동합니다. 확인하세요.Windows에서 Perl의 이름 바꾸기를 사용하는 방법Solaris에서는
rename
명령이 존재하지 않습니다.macOS의 Homebrew 패키지
rename
및util-linux
충돌macOS에서 Homebrew 패키지는
rename
다른 스크립트와 다르게 보이는 Perl 스크립트를 제공합니다.Arch Linux에서 이
perl-rename
패키지는 다른 스크립트와 다른 Perl 스크립트를 제공합니다.Feroda에서는
prename
다른 스크립트와는 다른 Perl 스크립트가 제공됩니다.데비안에서 대체품입니다
prename
.file-rename
rename
우분투에서는
file-rename
유일한 옵션입니다rename
므케시
rename
Perl의 를 사용하려면rename
전체 경로를 사용/usr/bin/rename
하거나 을 정의 해야 합니다.alias rename=/usr/bin/rename
CPAN
루트 권한이 있거나 없는 Universal Perl 설치
주변에 다양한 버전이 있기 때문에 이 접근 방식을 권장합니다. 이렇게 하면 어떤 버전을 갖게 될지 정확히 알 수 있습니다.
- 사용
cpan -i File::Rename
(더 나은 사용펄 브루잉일반 사용자의 경우). 명령rename
을 사용할 수 있습니다. 그렇지 않은 경우PATH
Perl 스크립트 유틸리티가 포함되어 있지 않은 것입니다. - for , 데비안 패키지를 만드는
Debian*
데 사용됨dh-make-perl --build --cpan File::Rename
아무것도 설치할 수 없다면,다운로드 해독립 실행형 스크립트(종속성(제외)이 없고 perl
새 버전보다 스위치 수가 적은 단순화된 이전 버전)
VS 배포판 매핑 rename
(좋은 배포판이 아닌 경우)
시스템 패키지 관리자를 선호하는 경우:
rename
이는 Debian(대체) 운영 체제 (Arch Linux rpm
기반 배포판, Slackware 및 *BSD와는 다름) 의 기본 명령입니다 .
rpm
배포 기준:dnf install prename
아치 리눅스/만자로:
pacman -S perl-rename
루트 다이어그램:
emerge dev-perl/rename
닉스오:
nix-env -i perl5.36.0-rename nix-env -iA nixos.perlRename
이것은권장되는 방법은 아닙니다순수주의자들을 위한 것입니다.
*BSD:
pkg install p5-File-Rename
Alpine Linux( 저장소
edge
의 포크 에 있으며testing
기본적으로 사용되지 않음):apk add perl-file-rename --repository=http://dl-cdn.alpinelinux.org/alpine/edge/testing/
애플 시스템:
brew install rename
데비안/우분투와 유사:
apt install rename
슬랙 소프트웨어:
slackbuild
문서
- 확인하다이름 바꾸기에 대한 Perl의 문서
- perldoc perle#문자 클래스단편을 이해하기 위해 꼭 읽어야 할 페이지
\d
,\w
\s
... (PCRE, Perl, Python, PHP)
유니코드
특정 유니코드 rename
구현도 있습니다:Unicode::Tussle
파일에 연속된 유니코드 UTF8 문자가 포함되어 있으면 AaaÃééZzz.mp4
유니코드 부분은 무시됩니다. 한 가지 해결책은 특수 스위치를 사용하는 것입니다 unicode
.
-u, --unicode [인코딩]
사용자 제공 코드를 실행할 때 파일 이름은 Perl(유니코드) 문자열로 처리됩니다.
인코딩이 있는 경우 인코딩을 사용하여 파일 이름을 디코딩/인코딩합니다.
인코딩은 선택 사항입니다. 생략하는 경우 다음 인수는 -e와 같이 "-"로 시작하는 옵션이어야 합니다.
또는 가 없는 (이전) 버전이 있는 경우 -u
다음을 수행할 수 있습니다.
PERL_UNICODE=ASD rename -n 's/\B\p{Lu}/ $&/g' ./*.mp4
확인하다
perldoc perlrun | less +/PERL_UNICODE
안전
가능성을 피하기 위해쉘 주입(감사해요@stephenchazeras):
rename -n 's/.*//' '--e=system"uname"#.mp4'
Linux
사용 습관 개발: (가장 휴대성이 좋음)
rename -n 's/.*//' ./*
또는 지원되는 경우:
rename -n 's/.*//' -- *
둘 다 예방할 수 있어요쉘 주입로 시작하는 파일을 처리합니다 -
.
예를 들어 파일 이름을 바꿔보세요.rename -n 's/.*//' -foobar.txt