![특수 문자 뒤의 모든 내용을 제거하려면 이름을 바꿉니다.](https://linux55.com/image/159339/%ED%8A%B9%EC%88%98%20%EB%AC%B8%EC%9E%90%20%EB%92%A4%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%EB%82%B4%EC%9A%A9%EC%9D%84%20%EC%A0%9C%EA%B1%B0%ED%95%98%EB%A0%A4%EB%A9%B4%20%EC%9D%B4%EB%A6%84%EC%9D%84%20%EB%B0%94%EA%BF%89%EB%8B%88%EB%8B%A4..png)
최근에 Perl 기반 기능을 발견했는데 rename
Perl에 대해 아무것도 모르기 때문에 제대로 사용하지 못합니다. 이 주제에 대해 많은 질문을 찾았지만 아무것도 도움이 되지 않았습니다.
이름을 바꾸고 싶어요
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
)이 필요합니다. 이것이 바로 g
in이 있는 이유입니다 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