누군가 온라인에서 모든 대문자 파일의 이름을 소문자로 바꾸는 것에 대해 요청할 때마다 다음 명령이 제안되는 것을 봅니다.
find "$(pwd)" -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;
이 부분은 이해합니다 find "$(pwd)" -depth -exec rename
.
누군가 그것을 분석하고 이름이 바뀐 정규식 명령을 설명할 수 있습니까? 즉:'s/(.*)\/([^\/]*)/$1\/\L$2/'
\/([^\/]*)
그뿐만 아니라 왜(.*)
?$1
Bash에 무엇이 있는지는 알지만$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.txt
dir/otherdir/foo.txt
dir/otherdir
하지만... 내 생각엔 다음과 같이 실행할 수 있을 것 같습니다.
find . -depth -execdir rename 'y/A-Z/a-z/' {} +
"$(pwd)"
(또는 더 간단하게 "$PWD"
)은 상대 경로가 아닌 절대 경로를 생성하는 데에만 작동 find
하지만 이렇게 할 필요는 없습니다. 전체 경로를 처리하는 문제를 제거하여 기본 수준에서 모든 디렉터리를 실행하는 대신 각 디렉터리를 개별적으로 -execdir
실행합니다 . 각 이름 바꾸기 호출에 여러 파일이 제공 되는 대신 rename
.{} +
{} \;
find
그러나 이 모든 것은 26개의 ASCII 문자에만 적용될 수 있으며 실제 언어에서 발견되는 나머지 문자(예: äöåé)에는 적용되지 않을 수 있습니다.