Rename
根據大小重命名文件的 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
主要技巧是更換
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}