셸에서 여러 파일의 이름을 일괄적으로 바꾸려고 하는데 인터넷에 이에 대한 자료가 엄청나게 많지만 특정 상황에 적합한 솔루션을 찾을 수 없는 것 같습니다.
"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
rename
Perl 패키지에 포함된 유틸리티를 사용하여 다음을 수행할 수 있습니다.
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