배치 파일 이름 바꾸기 스크립트가 파일 이름의 하위 문자열을 교환합니까?

배치 파일 이름 바꾸기 스크립트가 파일 이름의 하위 문자열을 교환합니까?

다음과 같은 이름의 파일 그룹이 있습니다.title_december_word1_word2.png디렉토리와 스왑 word1word2각 파일 내에서 반복하고 싶습니다.

button_december_state_pressed.png즉 -> 에서 이동button_december_pressed_state.png

이 작업을 수행하는 방법에 대한 제안이 있으십니까?

내가 찾은 OS X용 배치 프로그램 대부분은 단어를 분해하기 위해 문자를 지정할 수 없으며 누군가가 이 문제를 해결하기 위한 빠른 스크립트로 나를 도울 수 있기를 바랐습니다.

답변1

Bash에서는 다음과 같이 할 수 있습니다.

  for i in *; do echo $i | awk -F'[_.]' '{print $1"_"$2"_"$4"_"$3 }' ; done

이 명령은 먼저 현재 디렉터리에서 모든 파일을 찾은 다음 이러한 이름을 제공합니다(확인하지 않고세 개의 밑줄과 . 이 파일 이름)을 awk로 지정하면 원하는 순서대로 재정렬됩니다.

유일한 까다로운 부분은 -F'[_.]'옵션이 -F' '서로 다른 필드 사이의 구분 기호를 식별하는 데 사용된다는 것입니다. 이 마지막 경우 구분 기호는 기본값인 공백을 사용합니다. 그러나 옵션은 -F'[_.]'교환 가능한 요소의 문자 클래스(이 경우에는 밑줄과 점)를 정의하며 이는 마음대로 구분 기호로 사용할 수 있습니다.

편집하다:

좋습니다. 이것이 작동하므로 실제로 아무것도 이동하지 않고도 파일 이름을 바꾸는 실제 작업을 구현할 수 있습니다.

  for i in *; do ni=$(echo $i | awk -F'[_.]' '{print $1"_"$2"_"$4"_"$3"."$5 }') && mv "$i" "$ni" ; done

답변2

Zsh 및zmv

zsh(OS X에서는 기본적으로 제공됨)가 있는 경우 다음을 사용할 수 있습니다.zmv:

% zsh
% autoload -U zmv
% zmv 'title_december_(*)_(*).png' 'title_december_$2_$1.png'

다음 명령을 실행합니다( zmv -n실제로 이름을 바꾸지 않고 연습 실행을 수행하는 데 사용).

mv -- title_december_word1_word2.png title_december_word2_word1.png

분명히 첫 번째 부분이 이미지마다 다르면 좀 더 유연해질 수 있습니다.

% zmv '(*)_(*)_(*).png' '$1_$3_$2.png' 
mv -- foo_bar_word1_word2.png foo_bar_word2_word1.png
mv -- title_december_word1_word2.png title_december_word2_word1.png

이는 일치 항목이 탐욕적이므로 다른 일치 그룹 이전의 마지막 항목까지 모든 밑줄을 삼키기 때문에 작동합니다.


Perl 스타일rename

OS X에서는 다음을 얻을 수 있습니다.rename~와 함께홈브류:

$ rename -n 's/(.*)_(.*)_(.*).png/$1_$3_$2.png/' *
'foo_bar_word1_word2.png' would be renamed to 'foo_bar_word2_word1.png'
'title_december_word1_word2.png' would be renamed to 'title_december_word2_word1.png'

-n옵션은 이름이 변경된 항목만 인쇄합니다.

관련 정보