특수 문자 뒤의 모든 내용을 제거하려면 이름을 바꿉니다.

특수 문자 뒤의 모든 내용을 제거하려면 이름을 바꿉니다.

최근에 Perl 기반 기능을 발견했는데 renamePerl에 대해 아무것도 모르기 때문에 제대로 사용하지 못합니다. 이 주제에 대해 많은 질문을 찾았지만 아무것도 도움이 되지 않았습니다.

이름을 바꾸고 싶어요

filename - y01m01 - extra.log
filename - y01m02 - extra.log
filename - y01m03 - extra.log
...
filename - y05m12 - extra.log

입력하다

filename-y01m01.log
filename-y01m02.log
filename-y01m03.log
...
filename-y05m12.log

이름을 다음으로 바꾸었습니다.

filename-y01m01 - extra.log
filename-y01m02 - extra.log
filename-y01m03 - extra.log
...
filename-y05m12 - extra.log

rename 's/filename - y*/filename-y/ *.log사용하고 있지만 마지막에 이 문자열을 제거하는 방법을 모르겠습니다 . - extra의 문자 수는 - extra고정되어 있지 않고 파일마다 다르기 때문에 확장자 앞의 8자를 그냥 바꿀 수는 없습니다.

해결책은 (공백 포함) 이후의 모든 것을 바꾸는 것 같지만 코딩 방법을 모르겠습니다.

당신의 도움을 주셔서 감사합니다.

답변1

perl-rename명령은 정규식만 사용합니다. Perl이기 때문에 매우 강력한 Perl 호환 정규 표현식 언어(PCRE)를 사용합니다. 따라서 사용 방법을 배우고 싶다면 PCRE를 찾아보세요.

이 경우 파일 이름에서 모든 공백을 제거하고 문자열을 삭제하려는 것처럼 보입니다 -extra. 두 작업을 모두 사용할 수 있으며 다음과 같이 구분하면 됩니다 ;.

$ rename -n 's/ //g; s/-extra//' *.log
filename - y01m01 - extra.log -> filename-y01m01.log
filename - y01m02 - extra.log -> filename-y01m02.log
filename - y01m03 - extra.log -> filename-y01m03.log
filename - y05m12 - extra.log -> filename-y05m12.log

s/ //g"모든 공백을 빈 공백으로 대체"(따라서 모든 공백 제거)를 의미합니다 . 기본적으로 여기에 사용된 대체 연산자( s/old/new/options)는 첫 번째 항목만 대체합니다. 모든 일치 항목을 바꾸려면 "전역" 옵션( g)이 필요합니다. 이것이 바로 gin이 있는 이유입니다 s/ //g.

just는 s/-extra//"첫 번째 일치 항목을 -extra아무것도 없는 것으로 대체"를 의미합니다.

원하는 대로 작동한다면 를 사용하지 않고 다시 실행하십시오 . 이렇게 하면 실제로 실행하지 않고도 수행할 작업을 인쇄 -n할 수 있습니다 . rename테스트에 매우 유용합니다!

-extra정적 문자열은 아니지만 변경할 수 있는 경우 -마지막 문자열 이후부터 다음 문자열 이전까지 모든 항목을 제거할 수 있습니다 ..

$ rename -n 's/ //g; s/-[^-]*\././' *.log
filename - y01m01 - extra.log -> filename-y01m01.log
filename - y01m02 - extra.log -> filename-y01m02.log
filename - y01m03 - extra.log -> filename-y01m03.log
filename - y05m12 - extra.log -> filename-y05m12.log

여기서는 s/ //g모든 공백이 이전과 같이 제거됩니다. 즉, s/-[^-]*\././"a를 찾은 -다음 그 뒤에 a로 끝나는 가장 긴 0개 이상의 -문자가 아닌 항목을 찾아 .전체를 a로 바꿉니다 . 왼쪽의 ( )를 .이스케이프해야 합니다. 이스케이프되지 않으면 "모든 문자"를 의미 하므로 오른쪽에서는 문제가 되지 않습니다..\..

답변2

두 번의 교체를 수행할 수 있습니다. 한 번은 첫 번째 교체 후 부품을 교체한 -다음 모든 공간을 교체합니다.

rename -nv -- 's/-\s\w+[.]log$/.log/; s/\s+//g' *.log

교체가 예상한 대로 이루어졌다고 판단되면 -n깃발을 내려놓으세요.

답변3

다음과 같은 제안을 해보세요:

rename 's/(filename - y.*) - .*(\.log)/$1$2/' *.log

관련 정보