![이름 바꾸기 - 파일 이름의 [ ] 구분 부분을 파일 이름 끝으로 이동합니다.](https://linux55.com/image/226104/%EC%9D%B4%EB%A6%84%20%EB%B0%94%EA%BE%B8%EA%B8%B0%20-%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EC%9D%98%20%5B%20%5D%20%EA%B5%AC%EB%B6%84%20%EB%B6%80%EB%B6%84%EC%9D%84%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%20%EB%81%9D%EC%9C%BC%EB%A1%9C%20%EC%9D%B4%EB%8F%99%ED%95%A9%EB%8B%88%EB%8B%A4..png)
나는 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 끝 |