파일 이름에서 대괄호와 그 주변 내용을 반복적으로 제거합니다.

파일 이름에서 대괄호와 그 주변 내용을 반복적으로 제거합니다.

[.*]파일 이름의 시작 부분에 있는 괄호와 그 내용( )을 재귀적으로 제거하려고 합니다 .

예를 들어 [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덤프 파일을 사용하지 않고 가지고 있는 경우에도이름 바꾸기 작업 실행 취소.

관련 정보