명령 프롬프트의 입력에 따라 폴더의 파일 이름을 바꾸는 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
.D
N
이는 설치된 모든 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
로 사용된다는 점에 유의하세요 .$1
zsh -c