두 번째 또는 세 번째 문자 이전의 모든 항목을 제거하여 파일 이름을 바꾸려면 어떻게 해야 합니까?

두 번째 또는 세 번째 문자 이전의 모든 항목을 제거하여 파일 이름을 바꾸려면 어떻게 해야 합니까?

다음 이름을 가진 다른 폴더에 있는 파일 목록이 있습니다.

aaaaaa_bb_cccc_ddddd_ee.jpg

그 중 일부에서는 두 번째 이전에 모든 것을 제거해야 합니다.

cccc_ddddd_ee.jpg

다른 경우에는(이미 별도의 폴더에 있음) 세 번째 폴더 이전의 모든 항목을 삭제해야 합니다 _

ddddd_ee.jpg

일부 정규식을 사용하는 rename과 같은 명령에 대해 알고 있지만 이 경우의 정확한 표현은 모릅니다. Linux 터미널에서 이 작업을 어떻게 수행할 수 있나요?

답변1

Perl 이름 바꾸기 유틸리티를 사용하여

$ ls
aaaaaa_bb_cccc_ddddd_ee.jpg
$ rename -n 's/([^_]*_){2}//' *
rename(aaaaaa_bb_cccc_ddddd_ee.jpg, cccc_ddddd_ee.jpg)
$ rename -n 's/([^_]*_){3}//' *
rename(aaaaaa_bb_cccc_ddddd_ee.jpg, ddddd_ee.jpg)

-n플래그는 Rename이 수행할 작업을 출력하도록 지시합니다. 삭제하면 -n수정사항이 적용됩니다.

*현재 디렉토리의 모든 파일로 확장 됩니다 . 위의 예에는 파일이 하나뿐이지만 이름 바꾸기는 한 번의 실행으로 여러 파일에 대해 작업을 수행할 수 있으며 이 경우 *셸 루프보다 빠릅니다.

s/([^_]*_){2}//의미: 파일 이름에 있는 s모든 정규 표현식을 아무것도 없는 것으로 바꿉니다. ([^_]*_){2}정규식은 밑줄이 아닌 임의의 수 [^_]*_밑줄이 두 번 반복됨을 의미합니다.

답변2

두 번째까지 모두 제거_

rename -n 's/[^_]*[_][^_]*[_]//' *

세 번째 전에 모든 것을 제거하십시오_

rename -n 's/[^_]*[_][^_]*[_][^_]*[_]//' *

효과적으로 제거하면 -n테스트뿐만 아니라 파일 이름도 변경됩니다.

관련 정보