터미널에서 패턴 기반 배치 파일 이름 바꾸기


48

다음의 이름을 바꿔야합니다.

file_001_loremipsum.png
file_002_dolor.png
file_003_sit.png
file_004_amet.png
file_105_randomness.png

으로

upl_loremipsum.png
upl_dolor.png
upl_sit.png
upl_amet.png
upl_randomness.png

단 하나의 간단한 터미널 명령으로 어떻게 작동합니까?


1
모든 하위 폴더에 재귀 적으로 작동하는 안전 장치 정규식 기반의 파이썬 버전 : stackoverflow.com/a/39698169/191246
ccpizza

답변:


79

rename을 사용하여 위 예제에 대한 솔루션 :

rename -v -n 's/file_\d{1,3}/upl/' file_*.png

용법:

rename [options] [Perl regex search/replace expression] [files]

보낸 사람 man rename:

   -v, --verbose
           Verbose: print names of files successfully renamed.
   -n, --no-act
           No Action: show what files would have been renamed.

rename은 인수로 정규 표현식을 취할 수 있습니다.

우리가보고있는 것은 작은 따옴표 사이의 내용 '입니다. 로 정규 표현식을 구분하여 배치 할 수 있습니다 /.

공식 : s/(1)/(2)/여기서 (1)= 검색 패턴 및 (2)= 대체 패턴.

따라서 정규식에 익숙해 지고 패턴 기반 배치 파일 이름 바꾸기를 즐기십시오!


14
나는 이것이 우분투라는 것을 알고 있지만, 누군가 OS X 솔루션을 찾고 있는데도 내가 여기에 rename있으면 쉽게 설치할 수 있습니다 brew install rename.
sandstrom

우분투 18.10에서는 --no-act플래그가 --nono대신 사용됩니다. 이 답변은 좀 더 명확 할 수도 있습니다. [files]잠재적으로 이름을 바꾸려는 현재 디렉토리의 파일과 일치하는 초기 패턴 일치 파일을 나타냅니다 (예 : *현재 디렉토리에서만 모든 항목과 일치).
Patrick Dark

귀하의 링크 rename는 형식이 rename from to file있고 정규 표현식을 지원하지 않는 다른를 가리 킵니다 . 사실, 나의 리눅스 배포판 (Cent OS 7)은 정확히 그 버전을 가지고 있습니다.
Alex Che

6

파일이 여러 디렉토리에있는 경우 다음과 같이 찾은 후 이름 바꾸기를 사용하십시오.

find -iname file_*.png -type f -exec rename -n 's/file_[0-9]{3}(.*\.png)/upl$1/' {} \;

이름을 바꾼 후 -n을 테스트하려면 제거하고 계속 진행하십시오!-)

이와 같이 찾기 및 전원 이름 바꾸기를 연결합니다.

개인적으로 소스 헤더의 이름을 .h로 바꾸는 데 사용했습니다.

find -iname *.h -type f -exec rename 's/(.*\.)h/$1hpp/' {} \;

에 대한 설명서있다 -iname, -type그리고 -exec플래그에서 manpages.ubuntu.com/manpages/bionic/man1/find.1.html#expression . ( find --help이 명령에는 특별히 도움이되지 않습니다.) TL; DR : -iname패턴을 대소 문자를 구분하지 않습니다. -type f"일반 파일"과 일치합니다. 그리고 -exec그것이 발견 할 때까지 실행하는 식 ;(세미콜론) 문자.
Patrick Dark

5

이것은 거의 bash 매개 변수 확장의 마법으로 수행 할 수 있습니다!

for f in file_[0-9]*_*; do mv $f upl_${f#file_[0-9]*_}; done

file_[0-9]*_*;-첫 번째 패턴은 'file_anynumber_'로 시작하는 모든 파일을 통과하는 데 사용됩니다
${f#file_[0-9]*_}.-두 번째 패턴 file_[0-9]*_은 매개 변수 확장에서 bash에게 문자열의 구걸에서 'file_anynumber_'를 제거하도록 지시합니다.

자세한 내용은 다음을 참조하십시오 Parameter expansion.

man bash

이것은 정규 표현식이 아닌 glob를 사용하므로 [0-9]*한 자릿수와 문자열이 일치합니다. 아마도 숫자와 일치하는 더 좋은 방법이 있지만 간결한 것은 생각할 수 없습니다.
wjandrea

모든 하위 디렉토리에서이 명령을 재귀 적으로 사용할 수있는 방법을 제안 할 수 있습니까?
프란체스코 DM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.