이름 바꾸기 - 파일 이름의 [ ] 구분 부분을 파일 이름 끝으로 이동합니다.

이름 바꾸기 - 파일 이름의 [ ] 구분 부분을 파일 이름 끝으로 이동합니다.

나는 cygwin에서 이름 바꾸기 도구의 Perl 구현을 가지고 놀았고 마침내 cpan에서 설치하여 작동하게 만들었습니다.

나는 오랫동안 이 작업을 수행하지 않았기 때문에 정규식 작업에 약간 녹슬었습니다.

기본적으로 양식 폴더의 이름을 바꾸고 싶습니다.

[2022-10-10] This is a Test - This is a Test (some stuff) [393933939339]

또는

[2022] This is a Test - This is a Test (some stuff) [393933939339]

내용을 처음 []부터 끝까지 이동하여 다음과 같이 보이도록 합니다.

This is a Test - This is a Test (some stuff) [393933939339] [2022-10-10] 

또는

This is a Test - This is a Test (some stuff) [393933939339] [2022] 

위치 매개변수를 사용하여 이 작업을 수행하는 방법을 알아냈지만 패턴 일치를 사용하여 수행하는 데 문제가 있습니다.[]

rename  -n 's/^(.{12})(.*)$/$2 $1/'

이는 전체 날짜가 있는 폴더에 대해 수행되지만 연도만 포함된 폴더에 대해서는 수행되지 않습니다. 이상적으로는 이 모든 것을 처리하는 하나의 표현을 원합니다.

[]가 연산자로 간주되어 어떤 식으로든 이스케이프해야 할 수도 있다는 사실로 인해 이것이 복잡해질 수 있다고 생각합니다.

도움을 주시면 감사하겠습니다.

답변1

[]가 연산자로 간주되어 어떤 식으로든 이스케이프해야 할 수도 있다는 사실로 인해 이것이 복잡해질 수 있다고 생각합니다.

정확히. RE에서 문자를 이스케이프하는 표준 방법은 문자 앞에 백슬래시를 붙이는 것입니다 \. 그래서,

rename -n 's/^(\[.*?])\s*(.*)/$2 $1/s' '['*

되었습니다존경받는패턴 대체의 후행 수정자를 포함해야 합니다 s. 이렇게 하면 패턴이 개행 문자를 문자로 일치시킬 수 있기 때문입니다(결국 파일 이름에서는 유효합니다). 또는 as 파일 이름 패턴을 사용하여 변환할 수 있는 파일 세트로 간주되는 파일 세트를 제한하십시오(이것은 -v쉘에 의해 전달되고 유효한 인수 옵션으로 처리되는 등으로 시작하는 파일 이름을 무시합니다).rename'['*./*

답변2

나는 무엇을 할 것인가:

$ rename -n 's/^(\[.*?\])(.*)/$2 $1/' *393933939339*
rename([2022] This is a Test - This is a Test (some stuff) [393933939339],  This is a Test - This is a Test (some stuff) [393933939339] [2022])

정규식 일치는 다음과 같습니다.

마디 설명하다
^ 스트링 앵커의 시작
( \1로 그룹화 및 캡처:
\[ [
.*? \n을 제외한 모든 문자(0회 이상(가능한 한 적게 일치))
\] ]
) \1 끝
( \2로 그룹화 및 캡처:
.* \n을 제외한 모든 문자(0회 이상(최대한 많이 일치))
) \2 끝

관련 정보