Rename

根據大小重命名文件的 Bash 腳本

  • April 11, 2020

我有一個 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

主要技巧是更換

   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 的回答是一種非常有效的方法,但除非您經常重命名數千個文件,否則您可能不會看到差異。

像這樣的東西:

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}

引用自:https://unix.stackexchange.com/questions/579062