명령 프롬프트의 입력을 기반으로 폴더의 파일 이름을 바꾸는 bash 스크립트가 있습니다.
echo "Please rename and press enter" read rename
if [ -z "$rename" ]; then
printf "no caption was selected, aborting!\n"
exit 1
fi
printf "rename is $rename\n" count=1
for i in *.jpg; do
j=printf "%04d" $count
j="$rename"$j".jpg"
count=$((count + 1))
mv "$i" $j
done
fi
shift
done
폴더의 파일 이름이 크기에 따라 바뀌도록 이 스크립트를 어떻게 수정합니까?
크기에 따라 파일을 정렬하면 폴더에 다음과 같이 표시됩니다.
a009 978kb
a001 567kb
a003 499kb
a008 432kb
그래서 생성된 파일의 이름을 바꾸고 싶습니다.
a001 978kb
a002 567kb
a003 499kb
a004 432kb
답변1
이 같은:
echo "Please rename and press enter"
read rename
ls |
# prepend filename with file size in bytes
parallel stat -c %s,,sep,,%n -- |
# sort by number
sort -n |
# rename to sequencenumber followed by size in bytes
parallel -q --colsep ,,sep,, mv {2} "$rename"{#}_{1}
답변2
주요 비결은 교체하는 것입니다.
for i in *.jpg
그리고
for i in $(ls -S *.jpg)
그러나 Kusalananda가 지적했듯이 이는 "교육된" 파일 이름(공백 없음, 제어 문자 없음)을 가정하므로 여기에 다른 접근 방식이 있습니다.
count=1
ls -S --escape *.jpg | while read f; do
n=$(printf "%04d" $count)
((count++))
mv --no-clobber "$f" "$rename$n.jpg"
done
-S
파일 크기를 줄여
--escape
정렬 개행이 포함된 이름으로 인한 손상 방지
--no-clobber
스크립트가 두 번 실행될 때 대상 파일이 덮어쓰이는 것을 방지
PS Ole Tange의 답변은 동일한 작업을 수행하는 매우 효율적인 방법이지만 수천 개의 파일 이름을 자주 바꾸지 않으면 차이를 느끼지 못할 것입니다.
답변3
zsh
셸 에서 :
typeset -Z 3 count=0
for name in *.jpg(.DNOL); do
count=$(( count + 1 ))
mv -i -- "$name" "a$count.jpg"
done
.jpg
이는 현재 디렉토리에서 파일 이름 접미사가 있는 모든 일반 파일을 가장 큰 것부터 가장 작은 것 순으로 반복합니다. 각 파일에 대해 지금까지 처리된 파일 수를 0으로 채운 정수로 이름을 바꿉니다 aNNN.jpg
.NNN
glob 한정자는 ("길이에 따른 역순")을 사용하여 (.DNOL)
일치하는 파일 이름을 올바른 순서로 정렬하고 ("일반 파일 및 도트 파일")을 사용하여 일반 파일(숨겨진 이름 포함)만 선택합니다. 일치하는 이름("null glob")이 없으면 패턴이 null로 확장됩니다.OL
.D
N
이는 zsh
설치된 Unix 시스템의 모든 유효한 파일 이름에 적용됩니다.
그것을 사용하려면 bash
:
zsh -c 'typeset -Z 3 count=0
for name in *.jpg(.DNOL); do
count=$(( count + 1 ))
mv -i -- "$name" "a$count.jpg"
done'
$rename
변수를 파일 이름 접두사로 전달 하려면 대신 다음을 사용하십시오 a
.
zsh -c 'typeset -Z 3 count=0
for name in *.jpg(.DNOL); do
count=$(( count + 1 ))
mv -i -- "$name" "$1$count.jpg"
done' zsh "$rename"
마지막 줄 은 zsh
오타가 아니며 해당 값은 스크립트 내에서 사용됩니다 $rename
.$1
zsh -c