早上本想將一些照片上傳到相簿中,但是由於所有照片的副檔名都是JPG而不是小寫jpg,因此造成了“格式不正確”而不能上傳照片。此刻就產生了這樣一個問題:使用shell指令碼如何批量將所有檔案的副檔名JPG都改成小寫jpg?
既然要批量替換檔案名稱,那麼肯定得用一個for迴圈依次遍曆指定目錄下的每個檔案。對於每個檔案,假如該檔案的名稱為name.oldext,那麼我們必須原始檔案名中挖出name,再將它與新的副檔名newext拼接形成新的檔案名稱name.newext。依照這樣的思路,就誕生了下面的指令碼:
複製代碼 代碼如下:
#!/bin/bash
oldext="JPG"
newext="jpg"
dir=$(eval pwd)
for file in $(ls $dir | grep .$oldext)
do
name=$(ls $file | cut -d. -f1)
mv $file ${name}.$newext
done
echo "change JPG=====>jpg done!"
下面對針對這個程式作簡單說明:
1.變數oldext和newext分別指定舊的副檔名和新的副檔名。dir指定檔案所在目錄;
2.“ls $dir | grep .$oldext”用來在指定目錄dir中擷取副檔名為舊副檔名的所有檔案;
3.在迴圈體內先利用cut命令將檔案名稱中“.”之前的字串剪下出來,並賦值給name變數;接著將當前的檔案名稱重新命名為新的檔案名稱。
通過這個指令碼,所有照片的副檔名都成功修改。為了使這個指令碼更具有通用型,我們可以增加幾條read命令實現指令碼和使用者之間的互動。改進版的指令碼如下:
複製代碼 代碼如下:
#!/bin/bash
read -p "old extension:" oldext
read -p "new extension:" newext
read -p "The directory:" dir
cd $dir
for file in $(ls $dir | grep .$oldext)
do
name=$(ls $file | cut -d. -f1)
mv $file ${name}.$newext
echo "$name.$oldext ====> $name.$newext"
done
echo "all files has been modified."
附:另一個版本
複製代碼 代碼如下:
#!/bin/sh
# file name : rename_suffix.sh
# author: zhouhh
# Email: ablozhou@gmail.com
# Date : 2008.4.1
echo "input what suffix will be replaced :"
read SUFFIX_SRC
echo "input what suffix of file to rename to:"
read SUFFIX_DST
for i in *.$SUFFIX_SRC
do
if [ -e $i ]; then
echo "mv $i to `basename $i .$SUFFIX_SRC`.$SUFFIX_DST"
mv $i `basename $i .$SUFFIX_SRC`.$SUFFIX_DST
else
echo "file does not exist."
exit -1
fi
done