파일 이름에서 배치 파일 이름 바꾸기 스크립트 교체 하위 문자열? 내에서 스왑 하고 싶습니다

title_december_word1_word2.png 와 같은 파일 그룹이 있으며 디렉토리를 통해 반복 word1하고 word2각 파일 내에서 스왑 하고 싶습니다 .

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

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

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



답변

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

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

이 명령은 먼저 현재 디렉토리에서 모든 파일을 찾은 다음이 이름 ( 이 파일 이름에 3 개의 밑줄과.가 있는지 확인하지 않고 가정 )을 awk에 공급하여 원하는 순서로 다시 정렬합니다.

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

편집하다:

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

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

답변

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

이것은 경기가 욕심이 많기 때문에 다른 경기 그룹보다 마지막에 올 때까지 모든 밑줄을 삼키기 때문에 효과가 있습니다.


펄 스타일 rename

OS X rename에서는 Homebrew 를 사용할 수 있습니다 .

$ 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옵션은 이름이 바뀐 것을 인쇄합니다.