1 引子
信息,一直都是个人权力的一个基础。搜索,则是获取信息的必备能力。在信息时代,更是如此。
有人已将“在万千信息中,快速、搜索到有效资料的能力”,上升到“搜商”(Search Quetient,EQ),和“智商”、“情商”并列。
计算机系统的信息量巨大,几十万个文件,几百G字节(如果用来存储电影,一个1080P的mkv就有10个G,不过电影内部数据,对我们来说,用播放器查找就行了)。我自己的文件中,Linux个人目录(不包括系统文件):213749个文件,23, 479, 899, 907大小;Windows系统,68万多文件,500多G。
互联网连接了上亿台的设备,更是炸了,有多少垃圾大家都不知道。于是有了搜索引擎,让大家去手动搜索;后来因为时间和搜商问题,自己搜索也靠不住了,于是有了专门搜索信息然后推送的头条、最热等。
本次我们主要针对还算可控的计算机系统的文件。
2 Windows用户场景
Windows本身,提供了按“文件名、时间、大小”的查找方式(一般是子串查找),使用起来不方便。所以使用了小工具everything(同事A推荐),everything只来针对文件名搜索。我最常用:包含子串,或包含多个子串(并集操作),用起来不错。
文件内容查找,主要是在打开的应用程序中(如word、SourceInsight)查找,可以批量替换,全手工操作,对多文件查找、替换也有简单支持。
用户角度,用起来还可以;对于软件从业人员角度,功能、性能、自动化程度,都有待改进。
3 Linux软件人员场景
Linux中,文件查找工具find,文件内容查找工具grep,提供了强有力的工具,能满足软件人员的大多数需求。工具具体的参数分析,已有很多离线资料(书籍)、或在线资料(info、man)说明,这里只说明我经常遇到的场景和解决方式。
3.1 文件查找
我经常遇到的几个文件查找场景:
1)查找你记得大概名字的文件
查找文件名中包含“中文”的文件(特别用中文说明find是支持中文的,*是通配符,精确查找去掉*就行)
find ./ -name '*中文*'
2)查询指定日期前的文件
查找修改时间为30天前的文件(常规是日志、打包文件;-30则是修改时间为30天内的文件)
find ./ -mtime +30
查找比文件x.txt新的文件
find ./ -newer x.txt
3)查找指定的文件
查找类型为普通文件的文件(b:块设备;d:目录;c:字符设备;p:管道文件;l:符号连接;f普通文件)
find ./ -type f
4)进阶使用
组合查找,修改时间为30天前的,查找包含“中文”文件
find ./ -mtime +30 -name '*中文*'
查找当前目录、第一级子目录中,修改时间为30天前的,查找包含“中文”文件
find ./ -maxdepth 1 -mtime +30 -name '*中文*'
后处理,查找当前目录、第一级子目录中,包含“中文”,修改时间为30天前的文件,然后删除
find ./ -maxdepth 1 -mtime +30 -name '*中文*' -exec rm -rf {} \;
find ./ -maxdepth 1 -mtime +30 -name '*中文*' | xargs rm -rf #管道
3.2 文件内容查找
我经常遇到的几个文件内容查找的场景:
1)查找包含某个字符串的行
查找的所有文件中,包含"string"的行
grep string ./* #显示格式: "文件名路径:行内容"
grep -n string ./ #显示格式: "文件名路径:行号:行内容"
grep -i string ./* #查询时,忽略大小写
grep -w string ./* #查询时,完整字匹配
grep -r string ./* #前面是当前目录层次;加-r,递归到所有子目录
2)查找某个字符串的个数
查找包含"string"的文件,并显示个数和行数
grep -c string ./* #每个文件的匹配次数,没匹配的也显示
grep string ./* | wc -l #所有匹配行的行数,wc -l,统计行数
3)查找包含某个字符串的文件
查找包含"string"的文件
grep -l string ./*
grep -l string ./* | xargs cmd #搜索到文件,并对这些文件执行cmd命令
3.3 进阶使用
grep不仅可以查询文件内容,也可以查询管道内容,这个功能太生猛了!所有进程的输出,都可以用grep来操作!
1)文件查找扩展:查找包含“中文”,同时又包含'chinese'的文件名
find ./ -name '*中文*' | grep "chinese"
2)文件内容扩展:查找包含"string"的文件,没包含的就不显示了
grep -c string ./* | grep -v ":0" #-v不显示匹配的文件,所以匹配个数为0的就不显示了
3)还有经典的,查找指定名字进程
ps aux| grep user #显示包含user的进程
ps aux| grep user | grep -v 'grep' #去除grep本身进程
ps aux| grep ^user | grep -v 'grep' #因为有的进程命令行可能包含user名称,只显示user开头的
4)统计个人目录中文件个数、文件大小的命令
find ./ | wc -l #查找文件个数
du -sb #查找文件大小
5)正则表达式
这是grep成为“杀手级”应用工具的原因,有兴趣者请参考相关文档。
4 总结
find + grep,左右互搏,效率加倍,你值得拥有!