2012-01-28 2 views
1

이 일의 비 우아한, 비 유연한 방법이 같은 것 : 더미 변수와 환경을가 오염 된 피 (ffmpeg에 대한 예를 들어) 앞에 0을 지원해야순차 파일 이름을 바꾸는 방법은 0부터 시작합니까?

for path in *.jpg # IMG_1067_CR2.jpg, MG_1068_CR2.jpg, etc. 
do 
    mv "$path" "${index-0}.jpg" 
    let index+=1 
done 
unset index 

훨씬 더 좋은 방법, 드라이 런 옵션 (예 : rename)이 있어야하며 확장 프로그램을 두 번 지정하지 않아도됩니다. 기존 도구가이를 지원합니까? 이 IMG_0_CR2.jpg, IMG_1_CR2.jpg ...IMG_1067_CR2.jpg, IMG_1068_CR2.jpg...으로 바뀔 것이다

rename -n 's/IMG_([0-9]*)\.jpg/$1/; $_="IMG_".($_-1067).".jpg"' *.jpg 

답변

1

다음과 같이 할 수 있습니다 :

rename -n 's/IMG_([0-9]*)\.jpg/$1/; $_="IMG_".substr("000" . ($_-1067), -4).".jpg"' *.jpg 

"0"을 "0000"으로, "907"을 "0907"로 렌더링합니다.

+1

@ l0b0 : 그것은'sed'가 아니라 펄입니다. –

+1

@ shil88 : 차이점은 OP의 파일이 1067에 시작되었고 당신의 파일이 그렇지 않다는 것입니다. 그것은 작동하지 않는 문제가 아니라 단순히 다른 데이터 세트를 수용하는 것입니다. '+ 0'과 주변 괄호를 빼낼 수 있습니다. –

+0

설명에 많은 감사드립니다! 지금 나는 명령을 이해하고 당신의 솔루션을 '있는 그대로'의 어떤 미친 이유로 완벽하게 작동시킵니다. (당시에는 "명백하게"무작위적인 행동을 보여주었습니다 ... 내 끝 부분에는 이상하게 여겨졌습니다!). 이전 코멘트를 지우고 유지합니다. – shil88

1

:

또는 어떻게 앞에 0이 this solution 작업을 할 수 있습니다. 당신이 결과

#!/bin/bash 
i=0 
for img in *.jpg; do 
    echo mv "$img" "${img/_[[:digit:]]*_/_$((i++))_}" 
done 
unset i 

당신은 변화가 하위 디렉토리의 여러 수준에 재귀하려면

에 만족하는 경우 echo를 제거합니다. 당신은 쉽게 수행하여 배쉬 4.x의으로이 작업을 수행 할 수있는 작업은 다음과 같습니다

  1. 전에 다음 줄을 추가-for 루프에서 처리하는 for img in *.jpg; do
+1

'local'은 함수 밖에서 사용할 수 없다고 생각합니다. –

+0

@ 빅터 좋은 전화. 고정 – SiegeX

1

for img in **/*.jpg; doshopt -s globstar

  • 변화 선행 0을 사용하면 printf을 사용할 수 있습니다.

    ... 
    NEW=$(printf "%04d.jpg" $index) 
    mv "$path" "$NEW" 
    ... 
    
  • 관련 문제