您的位置:首页 > 运维架构 > Shell

shell脚本实现图片文件的重命名之修订版本~

2011-05-15 20:34 603 查看
还是提一下我写这个脚本的背景。

这段时间我在学习linux,发现真的还是很好用的系统。同时我在往我的QQ相册里面传图片的时候发现我的照片实在是乱的不能再乱了,而且上传的过程中每次最多只能上传300张,真的麻烦死我了,我不会windows的批处理,想到现在正在学习linux,就想到能不能写一支脚本,实现这样的功能:实现批量图片重命名,命名为固定统一的形式,并且可以按照预订的张数归档到文件夹中(也就是每个文件夹有N张照片,最后一个文件夹例外)。

经过多次发现问题,解决问题,算是完成了一个比较好的版本。

renam_sort.sh

用法:

./renam_sort.sh your_pic_path pic_n

其中your_pic_path是你放图片文件的路径(必有,否则不实现任何功能),pic_n是你预先设定的希望每个整理文件夹拥有的图片数量(可没有,只实现重命名,不实现归档整理)

源代码如下:

#!/bin/bash
#Program:
#	This script will help you sort your picture and rename them.
#History:
#	2011-05-11	Gsy	v1.0
#	2011-05-15	Gsy	v2.0	this edition has remove the bugs!
PATH=$PATH:~/bin
export PATH
if [ $1 == "" ]; then
echo "Usage: renamef.sh your_file_path."
else
function rename(){
#-lt means < and -gt means > and there are also -le and -ge means containing =
if [ "$1" -lt '10' ]; then
rename="IMG_0$1$2"
else
rename="IMG_$1$2"
fi

if [ "$4" == "$rename" ]; then
echo "$4 Donot need to rename."
else
mv "$3/$4" "$3/$rename"
echo $4" -> "$rename
fi
}
count_jpeg=0
count_png=0
count_gif=0
count=0
for i in `find $1 -type f -regex '.*/./(jpg/|jpeg/)' | sort -d`
do
count_jpeg=$(($count_jpeg+1))
count=$count_jpeg
filename=`basename $i`
pathname=`dirname $i`
lastname=".jpg"
rename $count $lastname $pathname $filename
done
echo "JPEG total: $count_jpeg"

for j in `find $1 -type f -regex '.*/.png' | sort -d`
do
count_png=$(($count_png+1))
count=$(($count+$count_png))
filename=`basename $j`
pathname=`dirname $j`
lastname=".png"
rename $count $lastname $pathname $filename
done
echo "PNG total: $count_png"
for k in `find $1 -type f -regex '.*/.gif' | sort -d`
do
count_gif=$(($count_gif+1))
count=$(($count+$count_gif))
filename=`basename $k`
pathname=`dirname $k`
lastname=".gif"
rename $count $lastname $pathname $filename
done
echo "GIF total: $count_gif"
echo "There is $count pictures totally"

#The code under will makedir and put file into the new dir.
if [ "$2" == "" ]; then
echo "you should tell the script how many pictures you want each dir to hold."
else
dir_name=0
ready2mv=1
for l in `find $1 -type f -regex '.*/./(jpg/|png/|gif/)' | sort -d`
do
filename=`basename $l`
pathname=`dirname $l`
crl=$(($ready2mv%$2))
ready2mv=$(($ready2mv+1))
if [ "$crl" == '1' ]; then
mkdir "$pathname/picdir$dir_name"
echo "new directory picdir$dir_name has been make"
mv "$pathname/$filename" "$pathname/picdir$dir_name/$filename"
echo "$filename has been moved to picdir$dir_name"
elif [ "$crl" == '0' ]; then
mv "$pathname/$filename" "$pathname/picdir$dir_name/$filename"
echo "$filename has been moved to picdir$dir_name"
dir_name=$(($dir_name+1))
else
mv "$pathname/$filename" "$pathname/picdir$dir_name/$filename"
echo "$filename has been moved to picdir$dir_name"
fi
done
fi
fi


后来发现还是存在问题,好想是basename和dirname的问题,只要文件名中有空格就会出现问题,空格的前一部分会被dirname取走,而basename只能区到空格后面的一部分。不过只要没有空格都还是能正常的使用的。

在网上查查再修改。。。。

终于解决了,在改文件名之前先看看那些文件名中有空格,有空格的去掉就是了~

在function上面插入以下代码就OK~

#remove the space char from filename
find $1 -type f -name "* *" -print | while read name; do
ren=$(echo $name | tr ' ' '_')
if [ "$name" != "$ren" ]; then
mv "$name" "$ren"
fi
done


欢迎交流学习~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: