不得不赞叹,cygwin 是神器! 跟实机linux没有什么差别,除了文件系统和别的一些特性外。
现在看来,相对比较合理的脚本有几个。当然,合理只是从算法方面来说,优化还不行。
总之,代码随时都要能跑起来,这是首要考虑因素。
上传并统计
#!/bin/bash
# 功能:从本地复制jpg图片到服务器"待修图"目录
# by Daniel Chow @speedup2010
# v1 2012年05月21日 星期一 22:58:31
# v3 2012年05月24日 星期四 20:50:17
# E 表示E盘
# W 表示W盘
_source=/cygdrive/E/$1/
#_des=/cygdrive/W/
_des=/cygdrive/W/
_log=${_source%/}
# 统计函数
count (){
_source=/cygdrive/E/$1
_log=$_source
if [ $# -eq 1 -a -d $_source ];then {
cd $_source
[ -f total.txt ] && rm -f total.txt
[ -f conflicts.txt ] && rm conflicts.txt
c_dir=$(echo ${PWD##/cygdrive/} | sed 's/\//:\\/;s/\//\\/g')
echo "当前目录==> $c_dir"
echo -e "\n正在计算...\n"
for _dir in *;do
echo -en "\t$_dir \t`ls -l $_dir | grep "^-" | wc -l`\n" >>$_log/total.txt;
done
sum_dir=$(sort $_log/total.txt | uniq | wc -l)
echo -e "\t目录\t 文件数">$_log/tmp.txt
sort $_log/total.txt | uniq >>$_log/tmp.txt
mv $_log/{tmp,total}.txt
echo -e "\n总计:\t$sum_dir\t $(awk '{sum_files+=$2};END{print sum_files}' $_log/total.txt)">>$_log/total.txt
echo -e "\n\t文件数统计\t\t \n`cat $_log/total.txt`\n"
}
fi
}
# 文件复制部分
copy (){
ls $_source/*/*.jpg 1>2 2>/dev/null && exist=T || exist=F
if [ $# -eq 1 -a -d $_source -a $exist == T ];then {
cd $_source
c_dir=$(echo ${PWD##/cygdrive/} | sed 's/\//:\\/;s/\//\\/g')
echo "当前目录==> $c_dir"
echo -e "\n正在复制...\n"
counter=0
for files in */*.jpg;do
_dir=${files%%/*}
if [ -f $_des$files ];then
echo "文件 $_des$files 已经存在">>$_log/conflicts.txt
elif [ ! -d $_des$_dir ];then
echo -e "目录 $_des$_dir 不存在" >>$_log/conflicts.txt
elif [ -d $_des$_dir ];then
cp $_source/$files $_des$_dir -nv && counter=`expr $counter + 1`
fi
done
echo -e "\n已经复制了$counter个文件\n"
sort $_log/conflicts.txt | uniq >>$_log/tmp.txt
mv $_log/{tmp,conflicts}.txt
echo -e "\n\t未复制目录/文件\t\t \n"
content=`cat $_log/conflicts.txt`
echo "$content" | sed 's/\/cygdrive\///' | sed 's/\//:\\/;s/\//\\/g'
}
elif [ $exist == F ];then
echo "目录 $c_dir 没有jpg文件"
else
echo -e "\t用法:\n\tupload 待复制目录(需有子目录)\n\t默认E盘,非E盘修改E为所需盘\n"
fi
}
count $1
copy $1
重命名脚本
#!/bin/bash
# by Daniel Chow @speedup2010
# 批量命名文件
# v1 2012年05月24日 星期四 19:53:03
# 下一版本加入转化utf8,省去第二步
# v2 2012年05月25日 星期五 11:14:57
# v3 2012年05月25日 星期五 21:19:39
help(){
script_name=$1
script_name=`echo ${script_name##*/}`
script_name=`echo ${script_name%%.sh}`
# 这里的sql只是一个文件名的作用
echo -e "\t用法: $script_name sql\n
运行之前,先进行下面操作\n
把数据库相应的表导出为excel,另存为以制表符为分隔的txt文档\n"
# 2、打开刚刚所保存的txt文档,另存为UTF-8的格式,sql为文件名,保存目录为pic\n
}
if [ $# = 1 -a -f $1.txt ];then {
_dir=~/img
sql=$1
TMP=tmp
[ $PWD == $_dir ] || cd $_dir
[ -f $TMP.txt ] && rm $TMP.txt
iconv -f gbk -t utf-8 $sql.txt | grep -o '[0-9]\{8\}\.jpg.*是' | awk '$2!=0{print $2"\t"$1};$2==0{print $3"\t"$1}' | sort -g >>$TMP.txt
count=0
for var in *.jpg;do
page=${var%%.jpg};
fn=`sed -n "/^$page\t/p" $TMP.txt | awk '{print $2}'`;
char=`echo $page | wc -c`
if [ $char -le 3 ];then
mv -v $page.jpg $fn && count=`expr $count + 1`
#rm $TMP.txt $sql.txt
else
echo "file: $page.jpg have nothing to do"
fi
done
rm $TMP.txt
echo "rename $count files ok"
}
elif [ ! -f $1.txt ];then
echo -e "\nerror: $1.txt does no exist\n
please do step 1 & step 2, and then run speed later. \n"
help
else
help
fi
复制文件到本地
#!/bin/bash
# by Daniel Chow @speedup2010
# v1 modified 2012-5-21 12:32
# 修改了参数位置使之与ncopy一致
# 下个版本,应该是会加入从服务器最终图片复制到本地的功能的
begin=$3
end=$4
_dir=/cygdrive/$1/$2
ext=.jpg
if [ $# == 4 ];then {
cd $_dir
if [ $begin -le $end -a -f $begin$ext -a -f $end$ext ];then {
total_pages=`expr $end - $begin + 1`
echo -e "syntax: copy w/y 号 开始页 结束页 \n"
echo -e "\n当前目录$PWD\n从$2复制到pic目录: $begin 到 $end ,共 $total_pages 个\n"
counter=0
for page in `seq $begin $end`;do
cp $page$ext ~/pic -v && counter=`expr $counter + 1 `
done
[ $1 == w ] && echo -e "\n从未修图${_dir##*/}复制了$counter个"
[ $1 == y ] && echo -e "\n从已修图${_dir##*/}复制了$counter个"
}
fi
}
else
echo -e "\n\tcopy使用方法:\n
功能: 从未/已修图中复制连续文件到pic目录\n
copy w/y 号 开始页 结束页 \n
eg1: copy w 110111224 9 20 从未修图110111224复制9到20到pic
eg2: copy y 110111224 9 20 从已修图110111224复制9到20到pic\n
notice:\n
1.开始页<=结束页
2.如果没有文件,表明文件在子目录,号应该这样输110111224/110111224"
fi