디렉토리의 모든 파일 이름에서 1을 빼십시오 (이름 바꾸기).


17

이름이 같은 이미지 파일이 들어있는 디렉토리가 있습니다

image1.jpg 
image2.jpg 
image3.jpg
...

불행하게도, 이미지 이름은 제로 기반으로해야합니다, 그렇게 image1.jpg해야 image0.jpg, image2.jpg해야한다 image1.jpg등등합니다.

이와 같은 mv 명령 을 생성 하는 스크립트를 작성하여 쉘 스크립트에 넣은 다음 실행할 수 있습니다.

mv image1.jpg image0.jpg
mv image2.jpg image1.jpg
mv image3.jpg image2.jpg
...

그러나 유닉스에는 깔끔한 방법이 있다고 생각합니다. 그래서 무엇입니까?


6
간격이없는 한 실제로 가장 간단한 방법입니다. ( for i in $(seq 0 100); do mv image$[i+1].jpg image$i.jpg; done)
Ricky Beam

5
이미지 순서가 중요합니까? 그렇지 않다면, 단지에서 마지막 이미지의 이름을 변경 imageN.jpg하는 방법에 대해 image0.jpg당신이 완료됩니다.
jnovacho

@jnovacho, 아주 영리합니다! 그러나 이미지 순서는 중요합니다.
웨스

답변:


20

오래된 펄 이름 바꾸기 :

rename 's/(\d+)(\.jpg)/($1-1).$2/e' *

[비고]

이미지 번호는 0보다 커야합니다.

이미지가 9보다 크고 $(ls -v1 *)앞에 0이없는 경우 클로버 링을 피하기 위해 사용하십시오 . @arielf에 의해 제안되고 @Graeme에 의해 주목됩니다.

-v확실 -n하지 않은 경우에는 자세하고 조치를 취하지 않는 용도로도 사용하십시오 .


"e"는 무엇을 나타 냅니까?
Wes

3
'e'는 평가를 의미하며 교체 섹션이 평가됩니다. 또한 참조perlreref

6
클로버를 피하려면 파일을 오름차순으로 전달해야합니다. 10 개 미만의 파일이 있거나 숫자가 앞에 0이있는 경우에만 제대로 작동합니다.
Graeme

나는 이것을 이미 알아 차렸고 또한 0소스에 없어야 합니다.

2
교체 *와 마지막에 `ls -v1 *`당신은 건드리지로부터 안전 할 수 있습니다. 가장 낮은 숫자에서 가장 높은 숫자로 갈 것입니다.
arielf

6

생성 된 mv명령을로 파이프 할 수 있습니다 bash. 따라서 스크립트로 복사하거나 실행할 필요가 없습니다. 보다:

command_that_generates_mv_commands | bash

그리고 파이프로 연결된 모든 것이 실행됩니다 bash.


더 깔끔하지 않습니다. :)그래도 문제를 해결하므로 +1입니다.
JMCF125

5

ls 출력을 반복 할 수 있습니다.이 예제에서 작동합니다.

i=0 
for file in $(ls *.jpg | sort) ; do 
     mv $file $(echo $file | sed 's/[0-9]*.jpg$/'${i}'.jpg/')
     i=$((++i))
done

파일의 동일한 경로에 있어야합니다


1
더 나은 사용하기 -i또는 -n함께 mv, 그것은 가장자리의 경우 덮어 쓰기를 방지 할 수 있습니다.
Graeme

없는 것 sort -V보다 나은 대신 할?
user80551

sort작동하지 않으면 문제가 될 수 있기 image10.jpg전에 표시됩니다 image1.jpg. sort -nk 1.8@Graeme의 답변과 같이 필요합니다 .
terdon

@ user80551 sort -V은 좋은 생각이며 내 대답에 추가 할 것입니다. 그러나 다른 경우가있을 수 있습니다. 일반적으로 누군가가 복사하여 약간의 피해를 입히는 경우와 같은 질문에 이러한 종류의 옵션을 추가하는 것이 좋습니다.
Graeme

4

다음은 패턴에 맞는 모든 것에서 작동하는 것 같습니다 imageNUMBER.jpg. 나는 명령이 무엇을 하는지를 먼저 보여주기 echo위해 mv명령 앞에 놓았습니다 . 실제로 이름을 바꾸려면echo

for i in `ls image*.jpg|sort -V` ; do 
    x=`echo $i|sed -e "s/image\(.*\).jpg/\1/"`
    y=$(( $x - 1 ))
    echo mv -i $i image$y.jpg
done

첫 번째 줄 ls image*.jpg|sort -V에서 파일 이름에 JPG 파일이 오름차순으로 나열됩니다. x=라인은 파일 이름에서 숫자를 추출합니다. y=라인은 하나의 수를 감소시킵니다. 그런 다음 입력 파일 이름과 y번호가 mv명령에 사용되며 -i파일을 덮어 쓰기 전에 플래그가 알려줍니다.

내 자신의 작은 테스트의 결과는 다음과 같습니다.

mv -i image1.jpg image0.jpg
mv -i image2.jpg image1.jpg
mv -i image123.jpg image122.jpg

개인적으로 파일 이름을 다른 파일 이름으로 바꾸는 것이 좋습니다. 이제 파일 처리 순서가 큰 차이를 만들 수 있기 때문입니다.


1
더 나은 사용하기 -i또는 -n함께 mv, 그것은 가장자리의 경우 덮어 쓰기를 방지 할 수 있습니다.
Graeme

아주 좋은 제안입니다. 답을 편집하겠습니다.
brm

맥 OS에서는 사용해야 sort -n-V옵션 does't의 존재를.
Vincent 앉아

4

데비안 기반 배포판에서 이름을 바꾸기 위해 링크 된 perl스크립트를 사용하려면 prenameGNU find/ 도 필요합니다 sort. 덮어 쓰기를 방지하기 위해 파일이 오름차순으로 정렬됩니다.

find . -regex '\./image[0-9]+\.jpg' -print0 | sort -zV |
  xargs -0 rename -n 's/(\d+)\.jpg$/@{[$1-1]}.jpg/'

-n원하는 것을 한 번 제거하십시오 . 그렇게하기 전에 이미 존재하는 파일에 대해 경고합니다. 그러나 파일 이름이 오름차순으로 표시되는 한 실제 실행시 충돌이 없습니다.


파일에 이미이 문제가 있습니다.
Wes

4

zsh:

autoload zmv # (in ~/.zshrc)
zmv -Qf -n 'image(<->).jpg(n)' 'image$(($1-1)).jpg'

( -n행복하면 제거 ).

(n)목록을 숫자로 정렬하는 것이므로 image9.jpg이름이 전에 변경 image10.jpg됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.