Jun 5

在列表中,搜索元素比较头痛,一般只会得到第一个元素的索引,这里,我改变了搜索过的元素。当然,实际操作中,是需要把列表复制的 如 d=c[:] 再对d进行处理。

此代码来自一个问题:

yjcong

这个, 我不晓得是哪个术语对应, 所以加了个引号.

问题有2个,

1) 在一个文件中, 如何在定位的"abcxyz"后, 如何显示其下一行的内容. 若是有很多个, 如何?

2) 假设搜索的关键字在第n行, 如何同时显示第n-1, n, n+1行的内容

thx

问题二在帖子中已经解决,不再处理。http://forum.ubuntu.com.cn/viewtopic.php?f=21&t=443359&p=3007102#p3007102

关键词改为熟悉的foo

 

 

测试用例

foo
akjkdjkejwl
rkewjlkrjwelk
foo
fewkjk1kl1l2l1212l1
fewkjrkewjn mnfmenw
ewkjrkjwl
barfoofwerjwekjr
barofwerjwekjr
 

输出结果

 

akjkdjkejwl

fewkjk1kl1l2l1212l1

barofwerjwekjr

 





#!/usr/bin/env python3
import re

def fun(c):
     for i in c:
         if re.findall('foo',i):
                 try:
                         print(c[c.index(i)+1])
                         c[c.index(i)] += 'someword' 
                 except:
                         print("keyword is in the last line")

 #f=open('d:/1')
 #c=[]
#[c.append(i) for i in f.readlines()]
 #fun(c)
fun(open('d:/1').readlines())

 

 

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

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 12

因为扫描图片要依页面来命名文件,扫描软件不支持逆序(或者叫做递减)命名的方式,所以必须要有一个操作,要么是把顺序乱的纸张排序过再扫描,要么先扫描再重新命名。如果让我来做,我选择后者,我不想给纸张重新排序

这个脚本做的事情是:1、修改文件拓展名大小写 2、反转文件名 ,如下:

$ ./rename_new.sh 100 105
第 100 页到第 105 页反转命名,共 6 页

100 --> 105
105 --> 100
101 --> 104
104 --> 101
102 --> 103
103 --> 102

#/bin/bash
unset origin
unset new
if [ $# == 2 -a $1 -lt $2 ];then {
begin=$1
end=$2
foot=`expr $end - $begin`
pages=`expr $foot + 1`
echo -e "第 $begin 页到第 $end 页反转命名,共 $pages 页\n"
# 定义旧文件序号
for i in `seq $begin $end`;do
        origin=(${origin[*]} $i);
#       echo ${origin[*]};
done

# 定义新文件序号
for j in `seq $begin $end |tac`;do
        new=(${new[*]} $j);
#       echo ${new[*]};
done
# 命名语句
for rename in `seq 0 $foot`;do
        if [ ${origin[$rename]} == ${new[$rename]} ];then
                echo -e "${origin[$rename]} = ${new[$rename]} 文件无需重命名"
        else
                echo ${origin[$rename]}' -->' ${new[$rename]}
        fi
done
}
else
echo -e "使用方法:\n
rename.sh 开始页码 结束页码\n
如 rename.sh 1 20 表示反转命名1到20页的文件\n
注意:开始页码要小于结束页码"
fi
#/bin/bash
# by Daniel Chow
unset small
unset big
ext=.jpg
begin=$1
end=$2
# 把所有大写转成小写
for small in `seq $begin $end`;do
        #echo $small;
        if [ -f $small.JPG ];then
        mv $small.JPG $small.jpg
        fi
done
# md5sum will be in next ver
if [ $# == 2 -a $1 -lt $2 -a -f $1.jpg -a -f $2.jpg ];then {
        sum=`expr $end + $begin`
        pages=`expr $end - $begin + 1`
        mid=`expr $sum / 2`
        echo -e "第 $begin 页到第 $end 页反转命名,共 $pages 页\n"

        for small in `seq $begin $end`;do
                big=`expr $sum - $small`
                #echo $big
                if [ $small -le $mid -a $small -ne $big ];then {
                        mv $big$ext var$ext
                        echo $small' -->' $big
                        mv $small$ext $big$ext
                        echo $big' -->' $small
                        mv var$ext $small$ext
                }
                else {
                        if [ $small == $big ];then
                        echo -e "$small is in the middle, no need to rename"
                        fi
                }
                fi
        done
#       md5sum *.jpg >big.txt
#       sed -i "s/ .*//g" small.txt big.txt
#       tac big.txt>mid.txt
#       cat mid.txt >big.txt
#       rm mid.txt -f
#       diff small.txt big.txt && echo "重命名成功"
}
else
        echo -e "使用方法:\n
        rename.sh 开始页码 结束页码\n
        如 rename.sh 1 20 表示反转命名1到20页的文件\n
        注意:开始页码要小于结束页码"
fi

第二版已经纠正第一版的错误,第一版不是有效的算法。使用了两个for 循环,一个是解决大小写问题(其实如果安装了rename,那变得更加简单,rename .JPG .jpg *.JPG),另一个的作用是重新命名,使用var.jpg作为中间过渡。

Dec 24
#!/bin/bash
# 基本思路
# 获取主数据(data.dat)
#=>获取标题(title.dat) <title></title>
#=>制作目录(index.html),以章节标题为内容
#=>分章节{001..055} <p></p>
#=>预备内容,分离样本html为两部分a.dat:DTD..<html>..<body><div> b.dat:</div></body></html>
#合并文档
#修正标题
mkdir novel/bak -p
sed -n '1,58p' data.dat >> index.html
# vi...
sed -n '1,58p' data.dat >>title.dat
awk '{print $1}' title.dat >1.dat
awk 'NR>1&&NR!=55{print $1};NR==55{print "$"}' title.dat>2.dat
sed -n '1,/<div>/p' ex.html >a.dat
sed -n '/<div>/,$p' ex.html | sed '1d' >b.dat
cp ../philosophy/justice/htmlbook.css .
cp * backup -fv

data=`cat data.dat | tr '\n' '\034' | tr ' ' '\032'|tr '\t' '\033'`
# 变量i的作用:行数/文件名
# 对于博客的代码高亮插件,千万不要缩进,否则会非常ugly.
for i in {001..055};do
sed -n "${i}p" title.dat | sed -e "s/^/<li><a href="$i.html">/;s/$/<\/a><\/li>/">>newtitle
j=`sed -n "${i}p" 2.dat`
echo "$data" | grep -oP "$i.*$j" | tr '\034' '\n' | tr '\032' ' ' | tr '\033' '\t' | sed -n '$d' >$i
sed -e 's/^/<p>/g;s/$/<\/p>/g' -i $i
cat a.dat $i b.dat >$i.html
title=`sed -n "${i}p" title.dat`
sed -r "s/<title>.*<\/title>/<title>$title<\/title>/" -i $i.html
rm $i -f
done

==> title.dat <==
001 河州小镇
002 兰州奇遇
003 迦夏之窟
004 剑使冰璃
005 凉州变故
006 神武观主
007 慕容璇玑
008 沙洲城堡
009 端倪乍现
010 大战周朱

==> 1.dat <==
001
002
003
004
005
006
007
008
009
010

==> 2.dat <==
002
003
004
005
006
007
008
009
010
011

==> a.dat <==
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="htmlbook.css" />
<title>第1课 谋杀的道德侧面 The moral side of murder </title>
</head>
<body>
<div>

==> b.dat <==
<a href="javascript:goPrevious()">上一页<a/> | <a href="javascript:goNext()">下一页<a/>
<script type="text/javascript">
var filename=location.href;
filename=filename.substr(filename.lastIndexOf('/')+1);
//下一页
function goNext(){
goPage(parseInt(filename,10)+1);
}
//上一页
function goPrevious(){


 

 

# htmlbook结构

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="htmlbook.css" />
<title>001 河州小镇</title>
</head>
<body>
<div>
<p>章节内容</p>
<a href="javascript:goPrevious()">上一页<a/> | <a href="javascript:goNext()">下一页<a/>
<script type="text/javascript">
var filename=location.href;
filename=filename.substr(filename.lastIndexOf('/')+1);
//下一页
function goNext(){
goPage(parseInt(filename,10)+1);
}
//上一页
function goPrevious(){
goPage(parseInt(filename,10)-1);
}
//进入页号为pagenumber的页面
function goPage(pagenumber){
if(pagenumber<10) pagenumber = "00"+pagenumber;
else pagenumber = "0"+pagenumber;
window.location.href=pagenumber+".html";
}
</script>
<a href="index.html">Index</a>
</div>
</body>
</html>

Dec 15

 

# shell 修改html电子书标题
# 使用file命令无法判断得到这个编码,只好用leafpad,得到gb2312
# 转码 
cd ebook
mkdir utf8
for i in *html;do 
    iconv -f gb2312 -t utf8 $i -o utf8/$i;
done
mv utf8/* .
rmdir utf8
# 获取标题 有25个
grep -P '^第([^0-9]*)章' *html>foo.dat
# 替换<title>...</title>
# 测试使用,在后面添加grep和显示文件名,以保证结果的正确
# for i in {001..025}; do 
#   j=`sed -n "${i}p" foo.dat`; 
#   sed "s/<title>.*/<title>$j<\/title>/" -i ${i}.html|grep title;
#   echo $i;
# done
for i in {001..025}; do  
    j=`sed -n "${i}p" foo.dat`; 
    sed "s/<title>.*/<title>$j<\/title>/" -i ${i}.html;
    echo $i; 
done

转码完成后,也可以不使用文件

 

a=`grep -P '^第([^0-9]*)章' *html`

for i in {001..025}; do 
    j=`sed -n "${i}p" <<<"$a"`; 
    sed "s/<title>.*/<title>$j<\/title>/" -i ${i}.html; 
    echo $i; 
done