[.*]
파일 이름의 시작 부분에 있는 괄호와 그 내용( )을 재귀적으로 제거하려고 합니다 .
예를 들어 [Author1]BookName.epub
이름을 로 바꿔야 합니다 BookName.epub
.
그러나 대괄호가 시작 부분에 있지 않은 경우(예 BookName[Author1].epub
: )에는 아무것도 변경되지 않습니다.
이 명령은 유효합니다find . -type f -exec rename -v "s/\[.*\]//g" '{}' \;
그러나 ^
대괄호가 파일 이름 () 시작 부분에 있는지 확인하기 위해 추가하면 find . -type f -exec rename -v "s/^\[.*\]//g" '{}' \;
작동하지 않습니다. "작동하지 않는다"는 말은 명령이 성공적으로 실행되지만 파일 이름이 변경되지 않는다는 것입니다. 오류도 없고 메시지도 없습니다.
여기서 무엇이 잘못되었을 수 있습니까?
답변1
파일 이름을 바꿀 때 파일 이름(경로의 마지막 구성 요소)만 변경했는지 확인해야 합니다.
Perl 이름 바꾸기의 일부 변형의 경우 -d
이 옵션을 사용하여 수행할 수 있습니다.
find . -depth -name '*\[*\]*' -type f -exec rename -v -d 's/^\[.*?\]//s' {} +
.*
참고: 탐욕스럽지 않은 so 대신 ( 와 일치 ) .*?
의 변형과 so 플래그는 여기서 텍스트 줄이 아닌 파일 경로를 다루기 때문에 줄바꿈과도 일치합니다../foo[x]bar/[a]b[c]d
./foo[x]bar/b[c]d
./foo[x]bar/d
\[.*\]
[a]b[c]
s
.
(따라서 파일 -depth
이름은 파일이 있는 디렉터리보다 먼저 변경됩니다.) 일반 파일의 이름을 바꾸는 것이므로 여기서는 꼭 필요한 것은 아니지만 일반적으로 필요하므로 파일 이름을 바꿀 때 이를 포함하는 습관을 갖는 것이 좋습니다.
rename
이 옵션을 지원하지 않으면 다음 -d
을 수행할 수 있습니다.
find . -depth -name '*\[*\]*' -type f -exec rename '
s:(?<!/)\[[^/]*?\](?=[^/]*\z)::s' {} +
즉, 경로 끝까지( ) [<characters-other-than-slash>]
뒤에 a가 오고 슬래시가 아닌 문자만 뒤에 오면 제거됩니다./
\z
답변2
여기서 무슨 일이 일어나고 있는지 보려면 다음 -print
작업을 사용해야 합니다(그리고 rename
해당 플래그를 사용하여 아무것도 변경하려는 시도를 일시적으로 중지해야 합니다 -n
).
find . -type f -print -exec rename -n 's/^\[.*\]//g' {} \;
명령으로 실행된 파일 이름을 봅니다. 모두 로 끝나기 때문에 패턴과 일치하는 항목이 없습니다 ./
.
대신, 줄의 [ … ]
마지막 항목 바로 다음에 일치 해야 합니다 /
. 이 간단한 버전에서는 /[ … ]
디렉터리 구성 요소에 일치하는 항목이 없다고 가정합니다.
find . -type f -exec rename -n 's!(.*/)\[.*?]!$1!s' {} +
이 더 복잡한 버전은 이 가능성을 올바르게 처리합니다(그리고 더 간단한 시나리오도 완전히 수용합니다).
find . -type f -exec rename -n 's!(.*/)\[[^/]*?]([^/]*)$!$1$2!s' {} +
희토류 분해:
s!x!y!s
- RE를 일치시키고x
텍스트로 바꿉니다y
. 후행을 사용하면s
일치 항목이 여러 줄에 걸쳐 있을 수 있습니다.(.*/)
-/
이를 첫 번째 대진표 일치라고 부르세요.$1
\[
- 텍스트 일치[
.*?]
- 다음을 포함하여 가능한 한 적게 일치시킵니다.]
([^/]*)
- 그렇지 않다면 최대한 많이 일치시키세요/
. 이 게임을 불러$2
$
- 성냥"줄 끝"$1$2
-그룹과 일치하는 모든 것을 교체$1
하고$2
두 경우 모두 원하는 작업이 수행되고 있다고 확신하는 경우 에만 -n
뒤로 변경하십시오.-v
답변3
누구든 마음이 편하다면FD그리고nr, 명령은 다음과 같습니다
fd -t f -x rnr -f --no-dump '\[.*\]' ''
사용하지 않는 것은 -f
을 사용하는 것과 같습니다 --dry-run
. --dry-run
기본값입니다.
--no-dump
덤프 파일을 사용하지 않고 가지고 있는 경우에도이름 바꾸기 작업 실행 취소.