Perl 이름 바꾸기 도구에서 \L$2는 무엇을 의미합니까?

Perl 이름 바꾸기 도구에서 \L$2는 무엇을 의미합니까?

누군가 온라인에서 모든 대문자 파일의 이름을 소문자로 바꾸는 것에 대해 요청할 때마다 다음 명령이 제안되는 것을 봅니다.

find "$(pwd)" -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;

이 부분은 이해합니다 find "$(pwd)" -depth -exec rename.

누군가 그것을 분석하고 이름이 바뀐 정규식 명령을 설명할 수 있습니까? 즉:'s/(.*)\/([^\/]*)/$1\/\L$2/'

  • \/([^\/]*)그뿐만 아니라 왜 (.*)?

  • $1Bash에 무엇이 있는지는 알지만 $1, 그게 무슨 \L$2뜻 인가요 rename?

  • 또한 이것이 단순한 것과 어떻게 다른지 알고 싶습니다.

    find "$(pwd)" -depth -exec rename 'y/A-Z/a-z/' {} \;
    
  • 마지막으로, 이와 같은 학습을 위해 어떤 책이나 자료를 추천하시겠습니까? 매뉴얼 페이지를 읽었 rename지만 그러한 사용법에 대한 설명을 찾지 못했습니다.

답변1

이스케이프되지 않은 첫 번째 s/, 마지막 및 중간 /문자는 대체 연산자 및 구분 기호이므로 패턴과 대체 문자가 있습니다./(.*)\/([^\/]*)$1\/\L$2

첫 번째 (.*)\/([^\/]*)항목은 (.*)\/최종 파일 이름 앞의 경로인 마지막 슬래시까지의 모든 항목과 일치합니다. 마지막 항목은 ([^\/]*)문자열 끝에 슬래시를 제외한 모든 항목과 일치합니다.

교체에서는 $1대괄호 안의 첫 번째 캡처링 그룹과 일치하는 경로, 즉 경로를 다시 넣습니다. 그런 다음 \L다음 부분, 두 번째 캡처 그룹 $2또는 파일 이름을 소문자로 만듭니다.

여기서 최종 결과는 소문자만이 최종 파일 이름 부분에만 적용된다는 것입니다. 예 를 dir/OTHERDIR/FOO.txt들어 . 후자로 이름을 직접 바꾸는 것은 아마도 존재하지 않기 때문에 작동하지 않을 것입니다.dir/OTHERDIR/foo.txtdir/otherdir/foo.txtdir/otherdir


하지만... 내 생각엔 다음과 같이 실행할 수 있을 것 같습니다.

find . -depth -execdir rename 'y/A-Z/a-z/' {} +

"$(pwd)"(또는 더 간단하게 "$PWD")은 상대 경로가 아닌 절대 경로를 생성하는 데에만 작동 find하지만 이렇게 할 필요는 없습니다. 전체 경로를 처리하는 문제를 제거하여 기본 수준에서 모든 디렉터리를 실행하는 대신 각 디렉터리를 개별적으로 -execdir실행합니다 . 각 이름 바꾸기 호출에 여러 파일이 제공 되는 대신 rename.{} +{} \;find

그러나 이 모든 것은 26개의 ASCII 문자에만 적용될 수 있으며 실제 언어에서 발견되는 나머지 문자(예: äöåé)에는 적용되지 않을 수 있습니다.

관련 정보