진주의rename

진주의rename

정말 엉망이군요. Perl이 이름 바꾸기를 위해 sed와 유사한 구문을 사용할 것으로 예상할 때 , 다양한 구현이 있고 대부분의 경우 Perl의 다른 버전(바이너리) s///이 있을 때 어떤 명령을 사용해야 하는지 어떻게 알 수 있습니까 ?renamerename.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]'

  • TitleCasemp4 파일 이름의 각 단어 사이에 공백을 추가 하려면 (PascalCase도착하다공백으로 구분된 단어):

    rename -n 's/\B[[:upper:]]/ $&/g' ./*.mp4
    rename(./FooBarBaz.mp4, ./Foo Bar Baz.mp4)
    

    시도가 만족스러운 경우 -n스위치를 제거하십시오 .dry-run실제 이름으로 변경.

  • 제로 패딩에 수정자를 사용하는 replacement것처럼 해당 섹션에 호출을 삽입 할 수도 있습니다 .sprintf "%03d", 7e

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

5분 안에 Perl을 배울 수는 없습니다.

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 패키지 renameutil-linux충돌

  • macOS에서 Homebrew 패키지는 rename다른 스크립트와 다르게 보이는 Perl 스크립트를 제공합니다.

  • Arch Linux에서 이 perl-rename패키지는 다른 스크립트와 다른 Perl 스크립트를 제공합니다.

  • Feroda에서는 prename다른 스크립트와는 다른 Perl 스크립트가 제공됩니다.

  • 데비안에서 대체품입니다 prename.file-renamerename

  • 우분투에서는 file-rename유일한 옵션입니다rename

  • 므케시renamePerl의 를 사용하려면 rename전체 경로를 사용 /usr/bin/rename하거나 을 정의 해야 합니다.alias rename=/usr/bin/rename

CPAN루트 권한이 있거나 없는 Universal Perl 설치

주변에 다양한 버전이 있기 때문에 이 접근 방식을 권장합니다. 이렇게 하면 어떤 버전을 갖게 될지 정확히 알 수 있습니다.

  • 사용 cpan -i File::Rename(더 나은 사용펄 브루잉일반 사용자의 경우). 명령 rename을 사용할 수 있습니다. 그렇지 않은 경우 PATHPerl 스크립트 유틸리티가 포함되어 있지 않은 것입니다.
  • 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

문서

유니코드

특정 유니코드 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

관련 정보