크기에 따라 파일 이름을 바꾸는 Bash 스크립트

크기에 따라 파일 이름을 바꾸는 Bash 스크립트

명령 프롬프트의 입력을 기반으로 폴더의 파일 이름을 바꾸는 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.DN

이는 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.$1zsh -c

관련 정보