跳至主要内容

博文

目前显示的是 2010的博文

listfile.exe 用正则表达式来找文件

背景 最近的工作里,涉及到不少目录之间的批量操作(产品的部署、文件夹之间的同步等等)。工作的环境是 Win XP,没有自带诸如 Linux 下 find 这样方便的工具。当然,我在我自己的环境里安装了 Cygwin,但我不能要求其他同事仅仅为了使用这个命令而也装一个 Cygwin。而且,find 是用通配符去匹配文件名,我一直幻想着用正则表达式来匹配文件名/目录,所以我趁周末开发这个小工具。程序已经写好了,并发布到了 Google Code 上,主页是 http://code.google.com/p/listfile/ 。如下图: 正如下面版权里写的,你可以对这个程序/代码做任何你想做的事情:将这个工具用于你的工作中;拿源代码去交作业;向你的<(男|女)?朋友们?> 炫耀你开发/找到了一个好玩的东西…… 使用方法 lf [OPTIONS] PATTERN... 描述 lf 通过给定的模式来列出文件(或目录),类似 UNIX 系统下的 find (1) 命令,不过 find (1) 是用统配符来匹配文件名。比如:星号(*)代表零到多个字符;问号(?)代表单个任意字符。不过,用于匹配路径的话,正则表达式的功能更强大也更灵活。另一个好玩的特性是 lf 可以输出彩色信息,就像 UNIX 里 ls --color=auto 一样。 参数 -a, --all 显示所有文件(包括隐藏文件)。 -A, --absolute-path 输出的文件路径显示为绝对路径。 -e, --exec command 执行命令。可以通过<1> .. <n>来引用前面匹配的路径的每一项,而<0>则匹配完整路径。 此外,可以通过用逗号分隔范围中的第一个和最后一个数字指定一系列连续的文件名。因此<0>和<1,n>是等价的。 -h, --help 显示这个帮助文档,并退出。 -i, --ignore-case 匹配时忽略大小写。 -r, --relative-path 输出的文件路径显示为相对路径(相对于当前路径)。 模式 模式表达式同时支持通配符和正则表达式,其中正则表达式要放在尖括号里(“<”和“>”)。 环境变量 USERPROFILE

祝大家新春快乐

祝大家新春快乐 redraiment, 2010-02-13 昨天和前天我参加了小学、初中、高中同学会。自毕业以来,小学和初中同学还是第一次相聚,大家都很开心。我也是头一回喝这么多酒,晚上沿着S型曲线回家。 今早起来为自己泡了一杯蜂蜜解酒,并习惯性地打开Google Reader看看订阅的新闻。博客更新的也不少,同学们都发表日志畅谈新年感言。在这弱冠之年不免多愁善感,一些同学抱怨现在春节没有节日气氛、感叹对过年不再有小时候的期盼,还有同学说过年要被逼吃很多垃圾食品、说一些言不由衷的话…… 我觉得大家不必如此,节日对我们来说并不是一条法律规定的几月几号。只要快乐,任何一天都是我们的节日。同一天对于每个人来说都有不同的意义,大家都有自己的节日:比如生日、结婚纪念日等。以前对于小朋友来说,穿新衣服就是最快乐的事情,所以过年无疑是最有吸引力的;在谈成一笔大生意或考上重点大学时,我们也都会相邀庆祝;一些人过生日很讲究,但也有像Leonard(生活大爆炸)一样觉得自己从产道被排除并不是一向重大成就,因此不需要纪念…… 在忙碌一年后和家人团聚吃年夜饭,是大部分人都觉得开心的事情,所以春节自古就是大家共同的节日。如果哪天大家都觉得千里迢迢挤春运回来吃顿饭不快乐,那这一天也不再是全民庆祝了。同样的,随着年龄的增长、阅历变得丰富,我们不同时期追求亦不相同,小时候喜欢新衣服现在可能喜欢新房新车。有些同学感叹说变得现实、没有童真了,我倒是觉得这样也无可厚非,有些人只喜欢看鲜花绽放的瞬间(比如火影里的迪达拉),也有人喜欢恒久远永流传(像火影里的蝎),也有类似陶渊明的“园日涉以成趣”欣赏春来冬去、花开花谢的全过程…… 另一方面,每个人对如何庆祝节日的观点也不一样。有些人喜欢锣鼓喧天、鞭炮齐鸣、红旗招展、人山人海,也有一些朋友喜欢待在“蝉噪林愈静鸟鸣山更幽”的自在生活。前些时候好多朋友都和我说这个寒假时最后一个假期了,建议我出去旅游,我说这一年我东奔西跑,没多少时间待家里,如果我喜欢旅游还回家干嘛?对我来说,在家好好休息就是最好的庆祝方式。 我希望大家都能用自己喜欢的方式庆祝节日,但也要能包容其他人^_^。在此祝福大家新春快乐、身体健康、万事如意!

过滤分享的Chrome扩展开发详解

过滤分享的Chrome扩展开发详解 redraiment, 2010-02-08 明确需求   扩展的功能在前文《 眼不见为净——过滤人人网分享的chrome扩展 》中已做了介绍:把人人网中一些带有“不分享就如何如何”等诅咒信息的标题给屏蔽掉,眼不见为净!描述得更详细些就是: 过滤功能只在人人网域名(http://*.renren.com/*)下启用; 只有访问人人网时,扩展的图标才显示; 好友的分享信息会出现在很多地方(如好友主页、新鲜事、分享主页等),这些都要过滤; 我只是不想看到那些讨厌的标题,但分享的视频、图片等还是想看的。   其中(4)是核心功能,(2)可有可无。 Chrome扩展简介   Chrome扩展的主页是: http://code.google.com/chrome/extensions/index.html 。在此我只简单地介绍一下和本扩展相关的内容,更详细的信息请访问其主页。在本扩展中一共只有六个文件,其中三个是图片文件(用于图标),其他三个文件大小都不到1KB,所以无需“多事”把所谓的源码上传,直接把那几行代码贴到文章中即可。下面逐一介绍六个文件: 图标文件   图标文件有三个尺寸,都是由同一张图片修改而成。我没什么艺术细胞,原始图片的作者并不是我,只是觉得蛮符合这个扩展的主题,呵呵。如果您知道它的作者请给我留言,或者有志同道合的朋友帮忙贡献一张新图标,在此谢过! icon19.png :大小为19x19,用于地址栏中显示; icon48.png :大小为48x48,在Chrome的扩展管理页面(chrome://extensions)中显示; icon128.png :大小为128x128,安装此扩展时显示。   原始图片: manifest.json   这个Chrome扩展的配置文件,用JSON(JavaScript)来描述与扩展相关的信息,完整介绍请访问: http://code.google.com/chrome/extensions/manifest.html 。本扩展的配置信息如下: {   "name": "FRRS",   "version": "0.2.3",   "description": &q

眼不见为净——过滤人人网分享的chrome扩展

眼不见为净——过滤人人网分享的chrome扩展 redraiment, 2010-01-31 人人网的分享标题   进人人网(校内网)就免不了分享一些在线视频、音乐……有些同学进校内也纯粹是为了看分享,呵呵。分享原本是不错的东西,可以让新鲜事迅速传播。但最近有部分人,在分享链接时,在标题上赫然写着“看见不分享就倒霉一年”、“不分享的考试挂科”等诅咒信息,强奸我们的眼睛,唯恐天下不乱!   以前,在人人网中分享好友的“分享”时可以自己修改标题,所以我看到此类信息时都会手工去除恶意信息。但最近人人进行了升级,分享好友的“分享”时只能添加评论,不能修改标题。询问周围的同学,也有不少人对此类标题深恶痛绝! 我要过滤   本来这无可厚非,人家写这样的标题或许他/她们真觉得这个视频、音乐很不错,迫切地希望大家都能看/听到。但每个人的喜恶不同,这样的做法有点类似看电影时旁边一个同学向你絮絮叨叨后面的情景——好心办坏事。我还是希望每个人能比较客观地发表自己的意见,因此我不希望这些标题出现在我的首页上。   一开始,我还是打算像往常一样写个客户端程序,每次在进人人网之前先执行一下,把带此类标题的新鲜事标记为已读。但以我这样的马大哈还真不能保证每次记得执行;另外,我从人人网上下载的Java Client开发包,但找来找去也没找到个像样的文档。所以就放弃客户端的想法。   转念一想“如果浏览器本身提供这样的功能就好了”,再一想就想到开发浏览器的扩展/插件。我习惯用Chrome,最新版的也支持扩展开发了,而且在线文档也比较完整: http://code.google.com/chrome/extensions/index.html 。 Chrome扩展   我已经将扩展发布,如果你也有被相类似的问题困扰,并且也使用最新的 Chrome 浏览器,欢迎到项目主页 https://chrome.google.com/extensions/detail/kajehjgpeliapeaileldhcabdalkeflo 下载安装。   安装完后,当打开人人网时扩展就会启动,并在地址栏里显示图标:   在页面加载完后,扩展就会自动检查你的“新鲜事列表”,把所有带“不分享”的文字统统替换掉,下图是我和同学做的一个测试:   想关闭过滤功能,只要将它禁用即可。这个程序很小很简单,我会在下一篇文章中

Linux下用nc实现DuplexPipe

Linux下用nc实现DuplexPipe redraiment, 2010-01-25   nc 是一把网络的瑞士军刀,我以前在介绍 DuplexPipe 时也提到过,如果你没接触过它,可以先参看一下《 DuplexPipe二三事(二) 》。再来简单地介绍一下 DuplexPipe,顾名思义,它是一个“双向管道”。在 shell 中,我们通过“|”使用匿名管道,让前一条命令的输出作为后一条命令的输入;双向管道即在此基础上在加上“后一条命令的输入作为前一条命令的输入”。这是最初开发它的原因,但后来发现它更像是一个网络接口转换器,“DuplexPipe”这个名字反而不能体现它的功能。更多内容请参看 DuplexPipe系列文章 。 留言   今天网友 黄海 给我留言,他通过用 nc 的 -e 选项来执行 nc 本身来实现 DuplexPipe。留言原文如下: 哥们,你写的那个DuplexPipe, 我很欣赏。不过近日于网上逛发现此工具的功能竟然完全可以用netcat做到,有两种方法,我的博客上载了一种。简单描述如下: 在windows下: echo nc [ip] [port] > relay.bat nc -l -p [port2] -e relay.bat 其余的类推 第二种方法是用命名管道:(linux下) mknod backpipe p nc -l -p [port] 0<backpipe | nc [ip] [port12] | tee backpipe   其中选项 -e 的作用是: for NT:    -e prog        inbound program to exec [dangerous!!] for Linux: -e filename    program to exec after connect [dangerous!!] Windows下不行   在我开发 DuplexPipe 时确实考虑过功能会不会和 nc 重叠,当时只想着通过 shell 管道来连接,忘了 nc 自带了一个双向管道!我首先在 Vista 下做了测试,nc(win32) 是从 http://www.securityfocus.com/tools/139 下载。开启三个命令提示符,分别执行: 1) nc -l -p 1234 2)

用awk去除C语言注释

用awk去除C语言注释 redraiment, 2010-01-06   今天闲逛 Linux宝库 ,看到 论坛 里有人在讨论如何用 shell 脚本来处理 C 语言注释,发帖时间是 08-10-23(以前怎么都没注意到,失败...),但问题好像并没被解决。正好这两天玩 sed & awk,来小试一下身手。 C语句注释   本文讨论的是 C99 标准,它支持单行注释(“// ...”)和块注释(“/*...*/”),并且当单行注释以“\”结尾时也可以跨多行。测试代码如下: #include <stdlib.h> #include <stdio.h> int main (int argc, char *argv[]) { // not show\ not show\ not show // not show /* not show */     int is; // not show     int /* not show */ ms; /* not show */     double ds; // not show\     not show\     not show     double dm; /* ...     not show     not show */ float fs; /**                            * now show                            */     float /**/ fm;     char cs[] = "aaa // /***/";     char cm1[] = /* not show */ "hello*/";     char cm2[] = "/*redraiment" /* not show */ ;      /* printf("/////"); */     return EXIT_SUCCESS; }   其中绿色部分就是注释,经过处理后需要将它们全部移除或用替换成空字符。 论坛原帖 中没有处理以“\”结尾的单行注释,也没处理注释关键字出现在字符串中的情况。 工具的选择   sed 是一个流编辑器,它能对文件进行“插

awk学习笔记

awk学习笔记 redraiment, 2010-01-05 看完sed部分之后   花了几个晚上看完后面 awk 部分。awk 不同于 sed,它是一门模式匹配的程序设计语言。学习 sed 和 awk 时,正则表达式可能是一大障碍。但事有凑巧,去年我暑假我一个人出去散心时,顺带看完了《 精通正则表达式(第三版) 》,另外我还掌握一些 Bash、Perl 等脚步编程的经验,因此很快就能适应 awk 的风格。   写到此处,我突然联系到《倚天屠龙记》中的张无忌,他经常说“我有九阳神功护体,学什么武功都很快”;那我们程序员也可以牛气地喊“我掌握了正则表达式,UNIX下工具上手都很快”,哈哈。 环境的问题   比起 sed,使用 awk 时让我有点小意外,哈哈 。    一 、Debian 5.0 默认安装的 awk 是 mawk 。我一开始以为是 GNU awk,直到测试“gensub”函数(gawk特有)时才发现不对,于是通过 CD 盘安装了 GNU awk。 到目前为止,gawk 的最新版本是  3.1.7,但 Debian 5.0 的软件包中提供的是 v3.1.5 。而 fedora 默认安装的是 gawk v3.1.5,另外我在 Windows 下也使用 gawk.exe v3.1.5。    二 、在上文《 sed单行脚本学习笔记 》中已经提到用模式“[ -~]”来匹配任意可打印字符,这个特性在 mawk 中也可使用。理论上在 GNU gawk 中不能使用,但在 Windows 平台下的 gawk 却也具备此特性。为保持脚本的可移植性,应该用“[:print:]”来代替。    三 、gawk 支持扩展的正则表达式,在文档中指出操作符“\B”可以匹配单词中字符与字符之间的空白位置。例如模式“/\Bour/”可以匹配“course”,不能匹配“our”。但这一特性在 gawk v3.1.5 中实现有问题。 $ cat data  ABCDE ABCD ABC AB A $ awk --version | head -1 GNU Awk 3.1.5 $ awk '{gsub(/\B/,"-")}1' data  A-B-C-DE A-B-CD A-BC A-B A   如上所示,当单词长度大于二,在 gsub 中“\B”