파일 이름을 연속된 숫자로 일괄 변경

파일 이름을 연속된 숫자로 일괄 변경

셸에서 여러 파일의 이름을 일괄적으로 바꾸려고 하는데 인터넷에 이에 대한 자료가 엄청나게 많지만 특정 상황에 적합한 솔루션을 찾을 수 없는 것 같습니다.

"timestamp-id"로 보이는 파일이 여러 개 있습니다.

abc_128390.png
abc_138493.png
abc_159084.png
...

카운터를 변경하고 싶습니다.

abc_001.png
abc_002.png
abc_003.png
...

내 (매우) 순진한 접근 방식은 다음과 같습니다.

mv abc_*.png abc_{001..123}.png

for또한 루프를 사용하여 작동 시키는 방법을 찾을 수 없습니다 .

불행하게도 rename이 특정 시스템에서는 사용할 수 없습니다.

어떤 조언이라도 대단히 감사하겠습니다!

답변1

증가하는 카운터를 더 스마트하게 처리할 수 있는 솔루션이 생각나지 않지만 다음과 같이 하면 작동합니다.

i=0
for fi in abc_??????.png; do
    mv "$fi" abc_$i.png
    i=$((i+1))
done

abc_*.png첫 번째 실행 전에 확장되므로 사용하는 것이 안전해야 mv하지만 끝에 6자 타임스탬프가 있는 파일만 원하므로 매우 구체적으로 지정하는 것이 유용할 수 있습니다.

답변2

renamePerl 패키지에 포함된 유틸리티를 사용하여 다음을 수행할 수 있습니다.

rename -n 'our $i; s/_.*/sprintf("_%03d.png", $i++)/e' *.png

참고: -n시험 실행의 경우 이를 제거하여 파일 이름 바꾸기를 적용하십시오.

답변3

그리고 zsh:

typeset -A count
incr='++count[$1/$2]'
(zmv -n '([^0-9]##)<->(*)(#qn)' '$1${(l:3::0:)$((incr))}$2')

만족스러우면 제거하세요 -n.

incr(변수를 사용하는 추가 단계에 유의하세요.ACE 취약점 방지)

예:

$ ls
a1b.png  abc_128390.png  abc_159084.png  x12y.png
a2b.png  abc_138493.png  a.png           x2y.png
$ typeset -A count
$ incr='++count[$1/$2]'
$ (zmv -n '([^0-9]##)<->(*)(#qn)' '$1${(l:3::0:)$((incr))}$2')
mv -- a1b.png a001b.png
mv -- a2b.png a002b.png
mv -- abc_128390.png abc_001.png
mv -- abc_138493.png abc_002.png
mv -- abc_159084.png abc_003.png
mv -- x2y.png x001y.png
mv -- x12y.png x002y.png

답변4

예를 들어 파일 이름을 바꾸려는 경우 cut을 사용하여 파일 이름의 일부를 잘라낼 수 있습니다.

"1 first.jpg"
"2 second.jpg"
...

도착하다

"10 first.jpg"
"20 second.jpg"
...

당신은 그것을 사용할 수 있습니다

for i in *jpg; do
  mv -iv "$i" "$(echo "$i"|cut -d\  -f1)0 $(echo "$i"|cut -d\  -f2-99)";
done

관련 정보