常在Linux下工作,偶尔要找些文件,面对find工具的各种参数,只是偶尔用一下的我表示鸭梨很大。每次都要man或者google,伤不起啊。
好吧,我怒了,不能忍,于是我决定写个工具,用sql语句来操作文件,名字就山寨一点,叫fql(File Query Language)吧。技术上用了ragel做词法分析,lemon做语法分析。
项目托管在http://code.google.com/p/fql。
稍微介绍一下。
这个小工具把所有的文件夹当做一张表,文件的属性如名称、大小、修改时间等作为列。每个文件就是一行。
于是可以这样:select name,size from /usr/local/bin where size>10k and time>=’2011-8-8′.你懂的。
不过为了与’ls -al’保持一致,这里’*'并不是表示所有列,而是表示’权限、用户名、组名、大小、修改日期、文件名’的缩写。
于是有这样的效果:
1
2
3
4
5
|
dccmx@~
/projects/fql
$ .
/fql
"select * where size > 4.1k and size < 100k"
-rw-r--r-- dccmx dccmx 12.8K 2011-08-02 08:38:03 lexer-rl.cc
-rw-r--r-- dccmx dccmx 19.9K 2011-08-01 10:40:35 parser.out
-rw-r--r-- dccmx dccmx 41.3K 2011-08-02 08:38:53 parser.cc
-rw-r--r-- dccmx dccmx 5.6K 2011-08-02 16:03:54 variant.h
|
还有这样的效果:
1
2
3
4
5
6
7
8
9
10
|
dccmx@~
/projects/fql
$ .
/fql
"select inode,* where name like '.*\.cc'"
265734 -rw-r--r-- 1 dccmx dccmx 2.3K 2011-08-09 02:51:46
expr
.cc
265562 -rw-r--r-- 1 dccmx dccmx 665 2011-08-01 08:35:04 lexer.cc
265561 -rw-r--r-- 1 dccmx dccmx 13.6K 2011-08-09 06:58:48 lexer-rl.cc
265651 -rw-r--r-- 1 dccmx dccmx 2.2K 2011-08-09 07:00:15 sys.cc
265783 -rw-r--r-- 1 dccmx dccmx 1.4K 2011-08-02 08:38:03 fql.cc
265731 -rw-r--r-- 1 dccmx dccmx 2.8K 2011-08-09 06:53:31 table.cc
265750 -rw-r--r-- 1 dccmx dccmx 41.7K 2011-08-09 06:58:48 parser.cc
265559 -rw-r--r-- 1 dccmx dccmx 912 2011-08-02 16:37:22 ast.cc
265785 -rw-r--r-- 1 dccmx dccmx 4.2K 2011-08-09 06:58:46 variant.cc
|
对于多文件夹的select,我还没有想好是做联合查询还是简单的同时查询多个文件夹,因为文件夹与文件夹之间没什么关联,感觉联合查询没什么用。
由于还没有完全测试,加上还有些功能没实现,所依没放到download里面,需要从svn里签出来编译。等全搞定之后,就可以抛弃find了,神清气爽啊。