다음 이름을 가진 다른 폴더에 있는 파일 목록이 있습니다.
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
테스트뿐만 아니라 파일 이름도 변경됩니다.