파일 이름의 여러 하위 문자열을 하나(bash 또는 zsh)로 바꿉니다.

파일 이름의 여러 하위 문자열을 하나(bash 또는 zsh)로 바꿉니다.

다양한 형식(예: 해상도 4k, 4K, 2160, XXY 등)의 정보가 포함된 파일 이름을 가진 텍스트 파일이 있는데 파일 이름을 일관된 단일 형식으로 바꾸고 싶습니다.

하나의 패턴만 수행할 때 다음을 수행했지만(스크립트에서 발췌) 여러 하위 문자열(OR 연산자)이 있는 정규식 형식을 포함하도록 1행을 조정하거나 변경할 수 있는 방법이 있습니까? 라인 3 패션.

line1: findhighresmarker=".4k."
line2: replaceWith=".2k."
line3: newFileName2K=${file//$findhighresmarker/$replaceWith}

물론, 대체 솔루션도 마찬가지로 환영하고 높이 평가됩니다. 미리 감사드립니다

답변1

정규식을 사용하여 파일 이름을 바꾸려면 perl rename유틸리티를 사용하십시오. OS/배포판에 따라 , , 또는 유사한 이름으로 rename불릴 prenameperl-rename있습니다 file-rename.

이것은아니요rename의 유틸리티와 동일하며 util-linux완전히 다른 기능과 호환되지 않는 명령줄 옵션을 갖춘 완전히 다른 프로그램입니다.

어떤 것을 설치했는지 확인하려면 옵션과 함께 위에서 언급한 명령 이름 중 하나 이상을 실행하세요 -V. Perl 이름 바꾸기의 경우 "perl" 또는 "File::Rename"이 언급됩니다. util-linux버전 인 경우 이를 언급합니다. Linux 시스템에 둘 다 설치하는 것은 드문 일이 아닙니다. 예를 들어 util-linux 버전은 rename또는 rename.ul이고 perl 버전은 prename또는 입니다 file-rename.

예를 들어 Debian에서는 다음을 모두 설치했습니다.

$ rename.ul -V
rename.ul from util-linux 2.38.1

$ rename -V
/usr/bin/rename using File::Rename version 2.01

어쨌든 제안한 패턴의 이름을 바꾸려면 다음과 같이 사용할 수 있습니다.

rename -n 's/resolution 4k|3840x2160|2160/4k/' ./*

-n옵션을 사용하면 시험적으로 이름을 바꾸지 않고 이름을 바꿀 내용만 인쇄합니다. 원하는 대로 작동한다고 확신하면 -n이를 제거하거나 -v자세한 출력으로 바꾸세요.

세미콜론 문자로 구분하여 원하는 만큼 바꾸기 작업을 추가할 수 s///있으며 각 파일 이름에 차례로 적용됩니다. 실제로 rename스크립트에서 유효한 Perl 코드를 사용할 수 있습니다(변수 범위에 주의를 기울이는 한 변수 및 서브루틴도 마찬가지입니다. strict모드에서 실행됩니다). 예를 들어, 파일 이름을 확인하고 일치하는 패턴을 기반으로 변수를 설정한 다음 설정된 변수를 기반으로 완전히 새로운 파일 이름을 구성하는 이름 바꾸기 스크립트를 작성할 수 있습니다.

sed간단한 교체 작업만 사용하는 경우 파일 이름 처럼 생각할 수 있습니다 .

예를 들어

rename -n 's/resolution 4k|3840x2160|2160[pi]?/4k/;
           s/resolution 2k|2560x1440|1440[pi]?/2k/;
           s/1920x1080|1080[pi]?/HD/;
           s/720x480|480[pi]|4:3/SD/' ./*

관련 정보