macOS 터미널에서 파일 이름을 일괄 변경하는 방법은 무엇입니까?


123

다음과 같은 일련의 파일이있는 폴더가 있습니다.

prefix_1234_567.png
prefix_abcd_efg.png

하나의 밑줄과 중간 내용 을 일괄 제거 하여 출력은 다음과 같습니다.

prefix_567.png
prefix_efg.png

관련성이 있지만 완전히 설명하지는 않음 :


NSString 및 NSMutableString의 범위 및 하위 문자열 메서드를 살펴보십시오
Grady Player

1
이에 대한 비단 말 솔루션을 고려해 보셨습니까? Automator 워크 플로우는 이러한 유형의 작업을 쉽게 수행 할 수 있습니다. 모든 파일의 이름을 바꾸고 텍스트를 _*_공백 으로 바꾸는 자동화 워크 플로를 만들 수 있습니다 .
암호화

내가 자동화 와일드 카드를하지 않을 수 있다고 생각
kidnim

답변:


234

특정 경우에는 다음 bash명령을 사용할 수 있습니다 ( bashmacOS의 기본 셸).

for f in *.png; do echo mv "$f" "${f/_*_/_}"; done

참고 : 파일 이름이로 시작될 가능성이있는 경우 파일 앞에 -위치 --[1] :
mv -- "$f" "${f/_*_/_}"

참고 : echo연습 mv실행을 수행하기 위해 앞에 추가됩니다 . 실제 이름 변경을 수행하려면 제거하십시오.

명령 줄에서 실행하거나 스크립트에서 사용할 수 있습니다.

  • "${f/_*_/_}"bash 매개 변수 확장 의 응용 프로그램입니다 . (첫 번째) 하위 문자열 일치 패턴 _*_이 literal로 대체되어 _이름에서 중간 토큰을 효과적으로 잘라냅니다.
  • 참고 _*_A는 패턴 (로도 글 로빙에 사용되는 와일드 카드 표현)이 아닌 정규 표현식 (실행 패턴에 대한 자세한 내용 man bash및 검색 Pattern Matching).

배치 이름을 자주 바꾸는 파일을 발견하는 경우 Perl 기반 rename유틸리티 와 같은 특수 도구를 설치하는 것이 좋습니다. macOS 에서는 다음과 같이 인기있는 패키지 관리자 Homebrew 를 사용하여 설치할 수 있습니다 .

brew install rename

다음은 맨 위에있는 명령에 해당하는 것입니다 rename.

rename -n -e 's/_.*_/_/'  *.png

다시 말하지만,이 명령은 드라 이런을 수행합니다. -n실제 이름 바꾸기를 수행하려면 제거하십시오 .

  • bash솔루션과 유사하게 s/.../.../텍스트 대체를 수행하지만 in과는 달리 bash진정한 정규 표현식 이 사용됩니다.

[1] --대부분의 유틸리티에서 지원하는 특수 인수의 목적은 Jacob C.가 언급했듯이 ,로 시작하는 옵션 처럼 보이 더라도 후속 인수가 피연산자 (값) 로 처리되어야 함을 알리는 것입니다 .-


3
훌륭한 대답, 완벽하게 작동했습니다. 나는 또한 당신이 그것을 더 설명하고 이것을 반복하면 더 우아한 해결책을 제공하기 위해 그것을 편집하고 편집 해 주셔서 감사합니다. 다시, 많은 덕분에 매우 도움이
kidnim

4
일치하는 대체 ( .*-> $1) 를 사용하는 예 , 예 : Rename Foo bar S01E01 biz baz.extto S01E01.ext:rename -n -e 's/.*(S[0-9]{2}E[0-9]{2}).*(\.[a-z]{2,4})/$1$2/' *
Steve Robbins

2
echo드라이 런 에 사용하는 아이디어를 좋아하십시오 . 팁 고마워!
James Wright

적극 권장합니다brew install rename
Chris Redford

98

파일 이름을 바꾸려면 rename유틸리티를 사용할 수 있습니다 .

brew install rename

예를 들어 현재 디렉토리의 모든 파일 이름에서 검색 문자열을 변경하려면 :

rename -nvs searchword replaceword *

변경 사항을 적용하려면 'n'매개 변수를 제거하십시오.

더 많은 정보: man rename


1
OS XGNU bash( x86_64-apple-darwin ) 버전 에는 이름 바꾸기 유틸리티가 포함되어 있지 않습니다.
l' L' l

4
덕분에, 네, 그것은을 통해 설치해야합니다brew install rename
데이비드 토마스

2
이 팁은 굉장합니다! 입력 한 rename -vs GLYCOPHORIN GLYCC *후 450 개 이상의 파일 이름이 자동으로 변경됩니다. 그리고 매우 빠릅니다.
Sander W. van der Laan

3
우수한! "변경 될 내용 표시"부분을 사랑하십시오. BEFORe 실제로 이름을 바꿉니다!
Ben Duffin

3
정규식도 사용할 수 있습니다. 이름 바꾸기 's / 123 / onetwothree / g'*
Bryan

12

sed를 사용할 수 있습니다.

ls * | sed -e 'p;s@_.*_@_@g' | xargs -n2 mv

결과:

prefix_567.png prefix_efg.png

* 드라 이런을 먼저 수행 mv하려면 마지막에echo

설명:

  • e : 하나의 sed 명령에만 선택 사항입니다.
  • p : sed에 입력을 인쇄합니다.이 경우 이름을 변경하기 전에 원래 파일 이름이됩니다.
  • @ : sed를 더 읽기 쉽게 만들기 위해 / 문자를 대체합니다. 즉, sed s / search / replace / g를 사용하는 대신 s @ search @ replace @ g를 사용하십시오.
  • _. * : 밑줄은 실제 '.'를 나타내는 이스케이프 문자입니다. 문자 0 번 이상 (정규식의 모든 문자와 반대)
  • -n2 : 매개 변수로 mv에 전달해야하는 2 개의 출력이 있음을 나타냅니다. ls의 각 입력 에 대해이 sed 명령은 2 개의 출력을 생성 한 다음 mv에 제공합니다.

1
다소 신비한 해결책이라면 영리합니다. 공백이 포함 된 파일 이름도 지원하기 위해 이것을 더 일반적으로 만드는 것은 훨씬 더 난해합니다. ls * | xargs -I % bash -c 'echo mv "%" "$(sed 's@_.*_@_@' <<<"%")"'( echo실제로 이름을 바꾸려면 제거하십시오 ).
mklement0

2
비전? 나는 이것을 사랑한다!
Bilal Akil

7

나는 be90-01.png와 같은 파일 배치를 가지고 있었고 대시를 밑줄로 변경해야했습니다. 나는 이것을 잘 사용했다.

for f in *; do mv "$f" "`echo $f | tr '-' '_'`"; done

2

rename사용하여 명령을 설치할 수 있습니다 brew. 그냥 brew install rename하고 사용하십시오.



1

이 시도

for i in *.png ; do mv "$i" "${i/remove_me*.png/.png}" ; done

다른 방법이 있습니다.

for file in Name*.png; do mv "$file" "01_$file"; done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.