크기에 따라 파일 이름을 바꾸는 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") 패턴이 아무것도 확장되지 않도록 합니다 .OL.DN

이는 설치된 모든 Unix 시스템의 모든 유효한 파일 이름에서 작동합니다 zsh.

이것을 사용하려면 다음을 수행하십시오 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

관련 정보