May 14

 如题所述,凭着折磨的精神,终于搞定。

依照这篇文章,完成了一部分,可是出现一些问题。

http://www.cnblogs.com/ddr888/archive/2010/05/16/1736990.html cx_Oracle说:Python访问Oracle并不难

原文全拿过来了。不管了,

 

标题很好的说明cx_Oracle的意义,但是就像Windows下访问Oracle那样麻烦一样,Debian中一样繁琐,本文将用尽量简单的过程介绍在Debian 5中Python访问Oracle,但cx_Oracle的使用请参考文档。

  Python实现对Oracle的访问需要以下两个组件和一个可选组件:
Oracle Instant Client 它是Oracle提供的一个简单的访问Oracle的组件,不用安装Oracle标准客户端。
cx_Oracle 一套符合python 数据库API规范的Oracle访问组件。
alient(可选) 简单来讲,就是能把RHEL下的程序包(.rpm)和基于Debian系统中的程序包(.dpkg)相互转换的工具。
一、Oracle Instant Client安装
  It is free!它提供了Oracle数据库访问的C语言接口OCI,cx_Oracle就是通过OCI访问数据库,所以如果只需要在客户端访问数据库,它就是最轻量的。注册并下载Basic包,里面有几个库文件,我们要做的是在cx_Oracle能使用OCI提供的接口,即把Basic包中的几个库文件加入Debian的共享库中。
?1
2
3 #mkdir /opt/oracle/instantclient
#cp Basic包中文件 /opt/oracle/instantclient
#vi /etc/profile

在底部加入以下指令:
?1 export LD_LIBRARY_PATH="/opt/oracle/instantclient/"

程序运行时一般会从系统默认的路径中查找共享库文件:/lib和/usr/lib。如果存在环境变量LD_LIBRARY_PATH,那么会先从这里查找库文件,有了这些库文件就可以安装cx_Oracle。
二、安装cx_Oracle
  cx_Oracle是Python中访问Oracle的一个扩展组件,也是很多地方推荐的方案。但是官方网站上并没有提供基于Debian系统类型的安装包,但是有rpm包,这里可以通过alient转换rpm转换到dpkg的折中方法来安装,当然也可以源码安装。
?1
2
3 #apt-get install alient
#alient cx_Oracle-*.*.*.*.rpm
#dpkg -i cx_Oracle-*.*.*.*.dpkg

三、cx_Oracle使用
  这里只介绍它的简单使用方法:
?1
2
3
4 import cx_Oracle
db = cx_Oracle.connect('username', 'pwssword', 'ip_address:1521/db_name')
print db.dsn
print db.version

小结
  本文记录了Debian中Python访问Oracle数据库的cx_Oracle的设置方法,如果有其他方法的经验,欢迎讨论。

别的就不说了。说遇到的问题,一直以来我用的是ubuntu,现在 改用debian。坑啊,没注意python版本差别,我一直以为是3.3哪知道 debian python3是3.2, 郁闷

好,再一个是路径设定,要看清楚。还有就是python的搜索路径,你mm的,没包含 /usr/lib/python3.2/site-packages 。。。

放狗搜索,解决了。btw,最近google越来越难用,修墙,不要修太强啊。所谓IT人为难IT人啊。。。何必呢

 

上网找了很多久未果,都来我自己糊里糊涂找到了解决方法,那就是在dist-packages(即/usr/local/lib/python2.6/dist-packages)添加一个路径文件,如mypkpath.pth,必须以.pth为后缀,写上你要加入的文件名称就是了,如我的:

/home/tony/tst-python

呃。最坑的就是最后出现了一个  

>>> import cx_Oracle
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: libaio.so.1: cannot open shared object file: No such file or directory

这样的错误。一看,直觉告诉我,这应该是libaio包缺失。。。好吧。先找debian 郁闷 sid排在前面,继续找,找到这个网站http://pkgs.org/download/libaio,也安装了,还是没找到文件。。。

再一想,不对, 既然是 Linux-native asynchronous I/O access library 那当然在源里的。立即apt-get install libaio 

呃,tab几下,你妹妹的,出现三个,选1那个安装了。世界和平了。。。。

 

>>> import cx_Oracle
>>> db = cx_Oracle.connect('foo/bar@127.0.0.1/bar')
<cx_Oracle.Connection to foo@127.0.0.1/bar>
>>> db.dsn
'127.0.0.1/bar'
>>> db.version
'9.2.0.1.0'

Oct 29

这里仅以d=1,a1=1,s=100的情况

1...100

如果要插入3 39 49 50这几位,而相应的后续项则应当加上d,以便仍然形成新的数列。

只要求加一次的做法:首先得到要插入的数字个数m=4, 然后以插入数中最大数50开始,后续所有项(含本项)加上m, 插入数中第二大的到最大数之间的项加上m=3,依次类推

原数列1...100

新数列 1 2 3 4..38 39 40...48 49 50 51 52 53 54....100 101 102 103 104

越是后面的项(以插入数之后为基准),加得越多。

加四

原来的50变成54

加三

原来的49变成52

加二

原来的39变成41

加一

原来的3变成4

抽象一下。

插入a b c三项(用k表示插入项数,则有k=3),0<a<b<c,如果用i来遍历数列,那么会有

if i>=c; then i=i+k

if i<c && i>=b; then i=i+k-1

if i<b && i>=c;then i=i+k-2

写成代码,可以这样来:项作为位置参数,位置参数个数作为k,每换一次参数k就减1,直至遍历所有位置参数。

 

Aug 18

虽然安装了acpi-support,但我的笔记本依然不能启用静音切换的快捷键,很不方便,于是自己写了个切换静音小脚本。至于调节音量,类推就行了。

 

# /etc/acpi/events/mutebtn
# Called when the user presses the mute button

event=button[ /]mute
action=/etc/acpi/mute.sh

 

#!/bin/sh
# /etc/acpi/mute.sh
vol=`amixer | sed -r "s/(\[|\])//g"  | sed -rn "/'Master'/,+6{h;/Playback.*%/{p;q}}" | awk '{print $5}'`
if test $vol != 0%; then
    echo $vol > /etc/acpi/volstore.dat
    amixer set Master front 0
else
    vol=`cat /etc/acpi/volstore.dat`
    amixer set Master front $vol
fi
exit 0

Aug 16

案例法确实值得称赞,虽然是“笨办法”,一字不差,没有任何含糊,不过它确实有效,那么它就不笨。

因欲写个重命名的工具(其实之前有用shell写过),后来觉得代码相当ugly,想换个方式来实现它。尝试过perl, 无奈,熟悉正则表达式的我表示无力,太不人性了(也许我要被喷了,^_^),于是转向python,。之前有接触过,教材不对,学习方法不对,我还没入门就撤退了。现在我选择“笨办法”,也确实学到点东西了。

下面是参考另人的代码写的一个小工具,实现操作:连接oracle数据库,导出列,以某一列为原始文件名,另外一列为新文件名,批量重命名文件,并移动到目标路径。

网上查过,移动文件python的效率不高,我就改用了系统命令 move, 在传递参数时,也许会造成困扰,不过我之前刚好看过c语言传递参数(先用sprintf把命令及参数存到一个变量,然后那个变量作为参数传入system())我也照着去做,实现了参数传递,程序是相通的。

说明:@foo 其中,foo是实例名。

 

import sys
import os
from os.path import exists
import cx_Oracle
import py2exe

reload(sys)
sys.setdefaultencoding('utf-8')

def getdata(chah):
     try:
         conn = cx_Oracle.connect("system/foo@foo")
         try:
             cur = conn.cursor()
             sql = """select yh,imgname from foo where 
             chah='%s' order by yh""" % chah
             cur.execute(sql)
             allData = cur.fetchall()
         finally:
             cur.close()
             conn.close()
     except Exception, e:
         print '数据库错误:', e
         return

     for rec in allData:
         oldname = "%s.jpg" %rec[0]
         newname = rec[1]
         if exists(oldname) and not exists(newname):
            os.rename(oldname,newname) 
            print "%s => %s" %(oldname, newname)
         else:
             return 0

print "\nchah ?(quit: input q and hit ENTER)"
chah = raw_input(">")
while chah != 'q':
     print "Running..."
     getdata(chah)
     target = "d:\%s" % chah
     action = "move *.jpg %s" % target
     os.system(action)
     print "\nchah is %s" % chah
     print "\nchah ?(quit: input q and hit ENTER)"
     chah = raw_input(">")

关于连接oracle数据库,遇到一些问题,着实花了我不少时间,幸好网上都有答案,感谢国家,感谢党,感谢人民,感谢google.

不说遇到的问题,就说怎么做吧。

python版本 2.7

oracle 版本 9.2.0.4

先下载两个文件

1、cx_Oracle-5.1.2-10g.win32-py2.7.msi

2、instantclient-basic-win32-10.2.0.4.zip 这是从oracle官网下载的,坑人啊,33+M, 还非常难下载!幸好有离线服务器,再次感谢……

 

第一步,安装cx_Oracle-5.1.2-10g.win32-py2.7.msi

第二步,从instantclient-basic-win32-10.2.0.4.zip解压oraocci10.dll、oci.dll、oraociei10.dll放到C:\Python27\Lib\site-packages

第三步,设定环境变量我懒得去分析了,直接上配置

系统变量  

NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

ORACLE_HOME=D:\oracle\ora90

路径PATH

D:\oracle\ora90\bin;D:\oracle\ora90\Apache\Perl\5.00503\bin\mswin32-x86;C:\Program Files\Oracle\jre\1.1.8\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%JAVA_HOME%\bin;C:\Program Files\Vim\vim73;d:\php5;D:\bin;C:\Program Files\MySQL\MySQL Server 5.5\bin\;d:\php5;D:\php5\ext;d:\nginx;C:\Program Files\SMPlayer\mplayer;c:\mingw\bin;C:\Python27\Lib

Aug 18
关键字 释义
and 逻辑与
assert  
as 作为
break 中断
class
continue 继续
def 定义函数
del 删除
elif 条件else if
else 条件else
except 异常处理
exec 执行
finally 最后
for for 循环
from 导入模块用
global 定义全局变量
if 条件if
import 导入模块
in 在...
is
lambda lambda 定义匿名函数
not 逻辑否
or 逻辑或
pass 跳过
print 打印
raise 引起异常
return 返回
try 尝试
while 当条件为真执行循环
with with 伴随???
yield 用在函数中, 先不计算,保留着

数据类型

布尔 True False

空类型 None

字符串 strings

数字型 numbers

浮点数(小数) floats

列表 lists

转义序列

跟c语言一样

字符串格式化

%d 十进制

%i

%o 8进制

%u

%x 

%X

%e

%E

%f 小数

%F

%G

%g

%c

%r 原样输出

%s 字符串

%% %

操作符

+ - * /  <  >  >=  <= == !=跟数学一样

** a**n表示a的n次方

// 取整如100//6=16, 乘以除数+取余可以得被除数。100 // 6 * 6 + 100 % 6 = 100

% 取余数(mod)

<>

() 定义元组或者函数参数 def a(x): pass

[] 列表

{} 集合或者是字典

@ 装饰符

, 对象之间的分隔符(或者叫做连接符)如 print "foobar", var (var为变量)

:  def foobar(): 或者for x in a: 多行语句 

. 方法操作符

= 赋值

;  +=  -=  *=  /=  //= %= **=  跟c一样

有些符号我还没搞懂,日后再完善了。

Jun 3

在工作中,遇到一些大图,甚至是超大图,对于大于6M的jpg图片,不得不优化一下,大图片的数量非常多,存在于不同数字编号目录里。

这里,要解决几个问题,

一、查找大于6M的jpg图片 我想到了find命令

二、分批处理与终止条件 要处理的图片实在是太多了,命令一运行,不知道连续多少天才能完成

三、备份源图片 复制就行了

四、图片优化程序的选择 必须是命令行的。我找到了jpegoptim,非常不错

五、经过优化的图片还是大于6M怎么办?不再优化!因为再处理的话,图片会严重失真,不符合要求。

六、多台机器同时处理 (未解决,文件锁问题)

 

问题二和三是紧密相连的

先说终止条件,有两种方法去终止这个脚本

1、用户输入要处理的大图数量,如100个,当处理完100个时,自然终止

2、当前处理数量小于用户输入数时,按^+C来终止,并手动把最后处理的一个文件从备份目录剪切到源目录

分批处理问题:以用户输入数为上限( 为何是上限?待处理大图未必有用户输入的那么多)

下次运行脚本时,如果有备份,就不处理已经备份的图片。

至此,全部问题得到解决。

以下附上脚本

#!/bin/bash
# by Daniel Chow @speedup2010
# v2 2012年06月 2日 星期六  2:44:05
# v3 2012年06月 2日 21:41:57
# v4 不知道跑哪去了。
# v5 2012年06月 3日 星期日 14:08:05
# 一次处理 n个大图

#bak_path=/cygdrive/b
#disk_x=/cygdrive/a
bak_path=/cygdrive/d/kingston/disk_b
disk_x=/cygdrive/d/kingston/disk_a
help(){
        echo -e "\033[31m\n\t大哥/大姐,不带这样玩的!!!\033[0m\n\t随便输入个正数吧"
        exit 0
}
if [ $# -eq 1 -a $1 -gt 0 ];then {
        echo -e "\n\t本次最多处理$1个文件"
        echo -ne "\033[31m
  \t欲终止,在显示\033[34mExif\033[31m时,按CTRL+C,\n
  \t并把最后处理的一个文件从备份目录剪切到源目录\n\n"
        echo -ne "\033[32m\t源目录:$disk_x\n
  \t备份目录:$bak_path\n
  \t源目录文件\t->\t备份文件\n"
        echo -ne "\033[0m"
        [ $PWD == $disk_x ] || cd $disk_x
        count=1
        for large_img in `find ????????? -iname "*.jpg" -size +6M -type f`;do {
                while [ ! -f $bak_path/$large_img ];do {
                        chah=${large_img%%/*}
                        [ ! -d $bak_path/$chah ] && mkdir -v $bak_path/$chah
                        cp $large_img $bak_path/$chah -v && jpegoptim --max=60 $large_img && count=`expr $count + 1 `
                        [ $count -gt $1 ]  && break 2
                        }
                done
        }
                        done;
        total_m=`expr $count - 1` && echo -e "\n\t处理了$total_m个文件\n"
        }
else
        help
fi
May 26

不得不赞叹,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
May 22

不断地思考,不断地想偷懒。

运行环境: cygwin

从目录4.25复制到目录e,如果文件存在/目录不存在,则不复制,并记录

 

.
|-- 4.25
| |-- 1
| | |-- 1.jpg
| | |-- 2.jpg
| | |-- 3.jpg
| | |-- 4.jpg
| | `-- 5.jpg
| |-- 2
| | |-- 1.jpg
| | |-- 2.jpg
| | |-- 3.jpg
| | |-- 4.jpg
| | `-- 5.jpg
| `-- 3
| |-- 1.jpg
| |-- 2.jpg
| |-- 3.jpg
| |-- 4.jpg
| `-- 5.jpg
`-- e
|-- 1
| |-- 1.jpg
| `-- 2.jpg
|-- 2
`-- 4

脚本运行结果(运行环境是cygwin)

  • 脚本输出方面
  • 文件、目录变化

=========脚本输出=========  

$ ./calc.sh 4.25;tree
当前目录 /home/pocoyo/4.25 正在处理

"/home/pocoyo/4.25/1/3.jpg" -> "/home/pocoyo/e/1/3.jpg"
"/home/pocoyo/4.25/1/4.jpg" -> "/home/pocoyo/e/1/4.jpg"
"/home/pocoyo/4.25/1/5.jpg" -> "/home/pocoyo/e/1/5.jpg"
"/home/pocoyo/4.25/2/1.jpg" -> "/home/pocoyo/e/2/1.jpg"
"/home/pocoyo/4.25/2/2.jpg" -> "/home/pocoyo/e/2/2.jpg"
"/home/pocoyo/4.25/2/3.jpg" -> "/home/pocoyo/e/2/3.jpg"
"/home/pocoyo/4.25/2/4.jpg" -> "/home/pocoyo/e/2/4.jpg"
"/home/pocoyo/4.25/2/5.jpg" -> "/home/pocoyo/e/2/5.jpg"

文件数统计
目录 文件数
1 5
2 5
3 5
总计: 3 15

未复制文件
目录 e:\3 不存在
文件 e:\1\1.jpg 已经存在
文件 e:\1\2.jpg 已经存在

===============以下是文件、目录变化===============

.
|-- 4.25
| |-- 1
| | |-- 1.jpg
| | |-- 2.jpg
| | |-- 3.jpg
| | |-- 4.jpg
| | `-- 5.jpg
| |-- 2
| | |-- 1.jpg
| | |-- 2.jpg
| | |-- 3.jpg
| | |-- 4.jpg
| | `-- 5.jpg
| |-- 3
| | |-- 1.jpg
| | |-- 2.jpg
| | |-- 3.jpg
| | |-- 4.jpg
| | `-- 5.jpg
| |-- conflicts.txt
| `-- total.txt
|-- calc.sh
|-- e
| |-- 1
| | |-- 1.jpg
| | |-- 2.jpg
| | |-- 3.jpg
| | |-- 4.jpg
| | `-- 5.jpg
| |-- 2
| | |-- 1.jpg
| | |-- 2.jpg
| | |-- 3.jpg
| | |-- 4.jpg
| | `-- 5.jpg
| `-- 4
|-- freeime6.5.exe
|-- rename.sh
|-- rename_new.sh
`-- scan_record.txt
#!/bin/bash
# by Daniel Chow @speedup2010
# v1 2012年05月21日 星期一 22:58:31
#_source=/cygdrive/d/$1
#_des=/cygdrive/e/
_source=~/$1/
_des=~/e/
_log=$_source
if [ $# -eq 1 -a -d $_source ];then {
        cd $_source
        echo -e "当前目录 $PWD  正在处理\n"
        for files in */*;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 -iv
                fi

                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 "总计:\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"
        sort $_log/conflicts.txt | uniq >>$_log/tmp.txt
        mv $_log/{tmp,conflicts}.txt
        sed "s|$HOME/||g" -i conflicts.txt
        sed 's/\//:\\/;s/\//\\/' -i conflicts.txt
        echo -e "\t未复制文件\t\t \n`cat $_log/conflicts.txt`\n"

}
else
        echo -e "用法: $0 待复制目录\n"
fi

写了个新版,不过有些东西还是重复了,要重新调整一下。

 

May 19

这是一条关于统计从第二行起,以\t为分隔符第二列到第四列数据总数的命令,如果是使用excel,如果数据是固定的,当然没什么问题,当数据不断地补充时,就不得不一次又一次的引用公式,实在是让人烦躁,而在这里,只要重新运行这条命令就行了。

不知道A0 A1 A2的自行google

提示:A0=2A1=4A2=16A4

下面全部转成A4

awk -F'\t' 'NR>=2{ sum_A0 +=$2;sum_A1 +=$3;sum_A2 +=$4 }; \
END { total=sum_A0 * 16 + sum_A1 * 8 + sum_A2 * 4;print total }' scan_record.txt

部分数据如下

No.     A0      A1      A2      date
0251    2       4       1      
0283    7       7       2
1497    6       6       8
1562    10      17

 

May 18

arch下安装了clisp

pacman -S clisp

需要帮助,输入 :h 回车.

维基百科有关于它的七条公理

 

Lisp 的 7 个公理(基本操作符)

基本操作符1 quote

(quote x) 返回 x,我们简记为 'x
基本操作符2 atom

(atom x) 当 x 是一个原子或者空表时返回原子 t,否则返回空表 ()。在 Lisp 中我们习惯用原子 t 表示真,而用空表 () 表示假。

基本操作符3 eq

(eq x y) 当 x 和y 的值相同或者同为空表时返回t,否则返回空表 ()

基本操作符4 car

(car x) 要求 x 是一个表,它返回 x 中的第一个元素

基本操作符5 cdr

(cdr x) 同样要求 x 是一个表,它返回x中除第一个元素之外的所有元素组成的表

基本操作符6 cons

(cons x y) 返回一个cons cell (x y)

基本操作符7 cond

(cond (p1 e1) ...(pn en)) 的求值规则如下. 对“条件表达式p”依次求值直到有一个返回t. 如果能找到这样的p表达式,相应的“结果表达式e”的值作为整个cond表达式的返回值.