2012年3月31日星期六

学习的"道"与"术"

读研以来,一直觉得自己的学习方法不够高效。试图将要学习的东西进行分类,然后以不同的方法学习之。那么该如何分类呢?我觉得以"道"与"术"区分之比较合适。


何为“道”?汉语辞典中有两条解释:1.指法则、规律;2.学术或宗教的思想体系
何为“术”?:技艺


字面理解,“术”更为具体,是完成一件事情的具体过程。而“道”者则是指导实践的思想,是能够举一反三的事物规律。

那么是否“道”比“术”更重要呢?我想未必。任何理论,任何“道”都最终来源于“术”的实践过程,也最终需要在“术”上得到实施,才能体现其价值。“道”与“术”两者相辅相成。那么在我们学习一门学问的过程中,就存在一个“道”与“术”何者为先的问题,即从“道”还是“术”入手学习?

孟岩说过这么一段话:
我主张,在具备基础之后,学习任何新东西,都要抓住主线,突出重点。对于关键理论的学习,要集中精力,速战速决。而旁枝末节和非本质性的知识内容,完全可以留给实践去零敲碎打。
原因是这样的,任何一个高级的知识内容,其中都只有一小部分是有思想创新、有重大影响的,而其它很多东西都是琐碎的、非本质的。因此,集中学习时必须把握住真正重要那部分,把其它东西留给实践。对于重点知识,只有集中学习其理论,才能确保体系性连贯性、正确性,而对于那些旁枝末节,只有边干边学能够让你了解它们的真实价值是大是小,才能让你留下更生动的印象。如果你把精力用错了地方,比如用集中大块的时间来学习那些本来只需要查查手册就可以明白的小技巧,而对于真正重要的、思想性东西放在平时零敲碎打,那么肯定是事倍功半,甚至适得其反。
虽然这段话并没有明确区分学习的“道”与“术”,以及何者为先的问题。但却大致说明了何为正确的学习方法。


从“道”与“术”的角度来理解,那关键的,核心的,创新的部分即为“道”,“大道”。而那细节的则是“术”的部分,是需要长时间的实践的,也许只有在实践中遇到的细节才是有意义的。


但那“具备基础之后”的“基础”是什么呢?我想应该是:1.明确问题是什么。这一点是再怎么强调都不为过的。要解决一个问题却没有真正明确问题到底是什么,那你努力多半是白费的。2.这东西是用来干什么用的,是用来解决什么问题的?对于工科学生来说,学习新东西的时候,这一点是需要首先明确的,只有明确了“干什么用的”,才能抓住学习的重点,提高学习的效率。3. 与以前的类似的东西相比,其区别是什么?一样东西,一种理论其价值往往在于对前人的突破,这突破的地方才是我们真正要掌握的。在学习一样东西之前,不妨多问问自己为什么要学这个,这东西对自己有多大的提升?不断地重复学习类似的东西,多半是没有意义的。


具备了基础之后,对于关键理论的学习,是不是只要抱着书本,理论对理论的学习就行呢?我想这是万万不可的。特别是对于着重于实践性的学问,比如编程,理论对理论地学习,只会让你吃力不讨好。绝大多数的创新理论,核心理论,都不是一下子就能理解的,特别是当你对这一领域的学问并不熟悉的情况下,它需要在反复的实践中逐步地加深理解。


那么对于关键内容的学习,我觉得这样学习会比较合适:先快速地,在尽可能短的时间内把关键内容浑沦吞枣地过一遍,能理解多少是多少,目的是为了获得一个理论的一个Big Picture,明确理论的各个部分之间的大致关系。然后对于每个部分,以及部分之间的关系,逐个地通过实践来验证你的理解,但这个实践过程并不属于“术”,因为它不是为了技艺,而只是为了验证自己对理论的理解。这一验证过程结束之后,你应该就能够对关键理论有个整体的正确的理解了。


然后,你就放开手去干吧,去解决那些现实中的问题!


也许,你会说,不用这么复杂吧?是的,如果你只是为了解决一个实际的问题,而这个问题也存在相近的解决方案,你不想也不需要弄懂这个问题,好吧,那你就直接去找解决方案吧。但你解决这个问题之后,你学到了什么呢?当你再次遇到一个本质上一样的问题的时候,你还是能快速地解决么?没有真正弄懂问题,没有弄懂问题背后的知识,那你就准备着为类似的问题重复地去寻找解决方案吧。恩,看起来有点傻哦。

2012年2月21日星期二

Python学习路线(针对具备一定编程经验者)

相比C,C++,JAVA等编程语言,P​ython​是易学的。但要想深入地理解​Python,并熟练地编写Python风格的Python代码。我想还是有一长段路程要走的。下面即是我的一点经验总结,主要是为了整理自己学习的思路。


1. 花1-2天的时间阅读一本好的Python入门书籍,并在亲手实践书中的代码。推荐入门书籍:《A byte of Python》(中文翻译《简明Python教程》)或《Practical Programming:An Introduction to Computer Science Using Python》(中文翻译《Python实践教程》)或者其他的比较薄的入门书籍。


2. 抛开书籍,用Python去写一切你想写的程序。这时最好的参考文档即为:1.Python命令解释器中的help(),dir()辅助方法;2.Python官网文档:http://docs.python.org/ 。遇到不清楚的地方就用这两个方法查,再不行就去google一下。


3. 两三个月之后,积累一点的代码量,再重新找本讲解比较详细的书,重新梳理一下自己对Python的理解,纠正自己实践中一些不好的方式。推荐书籍:《Beginning Python: From Novice to Professional》(中文翻译《Python基础教程》),《Learning Python》(中文翻译《Python学习手册》),《Dive into Python》,《Core Python Programming》等。另外,也应该在编码的过程中重复地去查阅Python标准函数库,标准库里已有模块实现的功能就不要自己实现。


4. 之后,根据实际需要,去了解使用一下Python的各个方面的函数库(比如http://docs.python.org/modindex.html中罗列出来的,以及matplotlib, numpy等用于科学计算,图形图像处理的),特别是诸多的Web框架(django, web2py, cherrypy, tornado等),可以先从简单的开始。如果是对Python的底层实现感兴趣,那么就该去看看Python源码,阅读一下《Python源码剖析》; 如果对文本处理感兴趣,可以阅读一下《Text processing in Python》等; 如果对网络感兴趣,可以阅读《Foundations of Python Network Programming》,尝试实现一个简单的web server ...


5. Python相关的开源函数库非常非常的多,各个方面的都有,所以学习者应该尝试着去用它们,了解它们,而不是啥都要自己来实现。因为Python擅长的就是快速开发,而且站在前人的肩膀上,我们才能站得更高,看得更远。当然如果你想加深自己对某个方面的理解,也可以尝试去实现一些简单的模块。


6. 总之一句话:学习Python的关键就是用!而且是要多用别人的。动手实践才是王道!那么多优秀的开源函数库不要浪费了!

2012年2月16日星期四

VNC简介

VNC(Vitual Network Computing) is a graphical desktop sharing system that uses the RFB protocol to remotely control another computer. It transmits the keyboard and mouse events from on computer to another, relaying the graphical screen updates back in the other direction, over a network.

VNC is platform-independent --- a VNC viewer on one operating system may connect to a VNC server on the same or any other operating system. There are clients and servers for many GUI-based operating system and for Java. Multiple clients may connect to a VNC server at the same time. Popular uses for this technology include remote technical support and accessing files on one's work computer from one's home computer, or vice versa.

A VNC system consists of a client, a server, and a communication protocol:

  • The VNC server is the program on the machine that shares its screen. The server passively allows the client to take control of it.
  • The VNC client(or viewer) is the program that watches, controls, and interacts with the server. The client controls the server.
  • The VNC protocol(RFB) is very simple, based on one graphic primitive from server to client("Put a rectangle of pixel data at the specified X,Y position") and event messages from client to server.
By default, RFB is not a secure protocol. While passwords are not sent in plain-text(as in telnet), cracking could prove successful if both the encryption key and encoded password are sniffed from a network. For this reason it is recommended that a password of at least 8 characters be used.

由于VNC系统是服务器-客户端模式的,所以先得在服务器(被控制的一方)上装上VNCserver,然后在客户端(主动控制的一方)上装上client(VNCviewer)。按照vncserver --help说明启动vncserver。服务器端有三个命令可以使用:vncconfig---配置命令,vncpasswd---设置client连接到服务器时需要的密码,vncserver启动一个server进程(对应一个Display No.),监听端口。

在服务器端的/root目录下会有个隐藏的文件夹.vnc,里面有加密过的密码文件passwd,每个vncserver进程的日志文件,以及配置文件xstartup。

服务器端启动vncserver后,即可在客户端启动vncviewer,在server一项中输入服务器的ip,后面跟一个:,以及一个Display No.,如果服务器端只启动了一个vncserver进程,那么就是1。然后直接回车,出现需要输入密码的登录框,输入服务器端设置的密码,然后直接回车即可。

2012年2月15日星期三

Linux命令习题


For each of the outputs listed below, find one sequence of commands connected by pipes that produces the output. For each problem, turn in the command sequence that you used to generate the requested output. (Do NOT turn in the output itself.)

1. A listing of all processes that you are currently running on the machine you are using, sorted by the command name in alphabetical order (i.e. a process running acroread should be listed before a process running bash). The output should consist only of the processes you are running, and nothing else (i.e. if you are running 6 processes, the output should only have 6 lines). 
ps -e --sort cmd
2. The number of words in the file /usr/share/dict/words (*) which start with the letter a.
[* Note: On some Unix/Linux systems, the dictionary has the filename /usr/dict/words]
cat /usr/share/words | grep ^a.* | wc -l
3. A "long" listing of the smallest 5 files in the /etc directory whose name contains the string ".conf", sorted by increasing file size. 
ls -lSrp | grep [^/]$ | grep [\.]conf$ | head -n 5
4. An executable file, named "echo.sh", with one sequence of commands to print hello world! on screen. 
(1) vim echo.sh and the content of echo.sh is echo hello,world! 
(2) chmod +x echo.sh
(3) ./echo.sh 

2012年1月1日星期日

2011年终-回顾与展望

    昨晚实验室聚餐,和师兄们喝醉了,明年的这个时候,我也就和他们一样将要毕业。时间,总是往前看觉得很漫长,可回过头去看看,一年也就是瞬间的事情。
2011,我从研一走向研二,2012,我将从研二走向研三,继而毕业,工作。
回顾过去一年,于我自己而言,过得很平淡,也许是大学以来最平淡的一年,只能说也许,因为对于2011,我记不得太多的事情。

这一年里,我,一个技术男,比以前更宅,话也相对少了很多,直接表现为QQ空间或者校内上的文字写得很少。很少和别人谈论自己,因为我觉得纠结于那个“小我”是件很“小青年”的事情。人与人之间不可避免的隔膜导致了个人的事情不管多大在别人眼里都是微不足道的,在别人的心里掀不起半点波澜,说过了也就忘了。所以那些关于自己的,还是放在心里比较好,毋须说些没意义的。

这一年里,我想得挺多,但真正做了或者说做好的却很少。这是件严重的事情。特别在技术上,东看西看,东学西学,眼界确实开阔很多,也养成了较为良好的技术趣味。但从技术能力上来说,真不好说,我都不知道自己有几斤几两。

这一年里,最大的收获,也许是对“学习”的重新认识,以及试图从“学知识”向“做事情”转变(这里的“做事情”特指“解决实际问题”),以前的自己太喜欢太沉迷于学东西,而忽略了自主地做事情。“生有涯,而知无涯”的无奈是必须面对的,对于有限的人生来说,知识必须对自己有用才值得学,特别是技术相关的知识,那怎么知道哪些知识对自己有用呢?得“边用边学”,需要用的时候再学。所以应多做事情,应找实际的问题,尝试去解决,在解决问题的过程中学习。解决实际问题才是根本,才是目的,而不是学习。学生时代习惯了学,习惯了边学边用,但对于研究生,对于以后的工作来说,光顾着学是没用的,而且一味的学也是非常难以深入的,要对某个方面有个深入的理解,必须通过做事情,发现问题,解决问题。
这一转变过程让我非常纠结,而且到目前为止还算不上成功。可能对于很多人来说,这个过程可能很简单,但对于我来说,好奇心强,喜欢学东西的来说,确实极其艰难的。每做一件事情,都很可能陷入学习的状态,而不会及时地适可而止。
这一过程希望在2012年有个很好的进展。
这一年里,我逐步意识到自己存在的另一个大问题---不够自信,其外在表现为和别人一起时,极其容易将自己的观点让位于别人的观点,即使我并不认为自己的观点存在什么问题,或者别人的观点比我的更正确。我只是不想凌驾于别人之上,不想让自己影响到别人。这听起来似乎不关乎自信,但我想本质上是的。“不够自信”这看起来也似乎不是什么大问题,但我想对于一个成年人,特别是一个男人,自信是非常重要的,对于事业也是件非常重要的事情。以前自己活得太谨慎,不喜欢在公共场合表现自己,觉得提高自己的内在修为才是重要的。但其实活在社会中,适时适当地表现自己,表达自己的观点,坚持自己的看法是非常重要的。有个词叫“内圣外王”,以后我得更加注重“外王”,内外兼修。
这一年里,我活得又很随性(和“活得谨慎”矛盾而共存),不太注意自己的言行,脏话口头禅也比较多,虽然在我看来,我的脏话全是在表达一种情绪,仅此而已。但我想在别人来看,其感受也许并不是这样的。我们年轻人还是要注意自己的形象的,呵呵。另外,尽量少评论别人,特别是别人的缺点。
这一年里,我很懒散,自己都有些看不过去了,“这样的日子,再好的,没有了”,我想不是件好事情。能够自我安慰点是还读了点书,整理一下:
社科文艺类:
  • 佛祖在一号线
  • 书虫小札
  • 复杂性思想导论
  • 人生
  • 给研究生的学术建议
  • 边城
  • 朱镕基答记者问
  • 窗里窗外
  • 联大八年
  • 笑谈大先生
技术类(部分是按需选取章节阅读):
  • Shell脚本学习指南
  • Linux内核设计与实现
  • 鸟哥的Linux私房菜
  • PHP和MySQL Web开发(原书第3版)
  • 分布式处理实践
  • Java Collections
  • 可爱的Python
  • 浪潮之巅 
  • CSS Web设计快速上手
  • 编程人生
  • C陷阱与缺陷
  • 调试九法
  • 黑客与画家
  • Python UNIX 和Linux 系统管理指南
  • 版本控制之道
比较而言,数量上不算少,也不算多,但主要问题还是质量上,觉得自己有些浑沦吞枣,读得太匆忙。这是以后的阅读需要注意的,克制焦躁的心理,慢慢阅读消化。
新的一年,具体来说,我需要面对的几件大事情,大致包括:
  • 小论文
  • 实习
  • 毕业论文,包括答辩
  • 找工作
  • ...
2012年底,我将要毕业了(虽然,形式上是2013年毕业),我就要工作了,这也许是和高考相当的一件大事,希望自己能够举重若轻,踏实准备,顺利应对。(再具体点是不是应该说多多coding,多做事情!哈哈)

2011年12月28日星期三

Linux命令find,xargs详述

转自:http://www.linuxsir.org/main/node/137

版权声明
本文是zhyfly兄贴在LinuxSir.Org 的一个帖子而整理出来的,如果您对版权有疑问,请在本帖后面跟帖。谢谢;本文的HTML版本由北南南北整理;修改了整篇文档的全角及说明文字中的单词中每个字母空格的问题;为标题加了编号,方便大家阅读;
前言:关于find命令
由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权限。
在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。

一、find 命令格式

1、find命令的一般形式为;
find pathname -options [-print -exec -ok ...]

2、find命令的参数;
pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print: find命令将匹配的文件输出到标准输出。
-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {  } \;,注意{   }和\;之间的空格。
-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

3、find命令选项
-name 

按照文件名查找文件。

-perm 
按照文件权限来查找文件。

-prune 
使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。

-user 
按照文件属主来查找文件。

-group 
按照文件所属的组来查找文件。

-mtime -n +n 
按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项,但它们都和-m time选项。

-nogroup 
查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。

-nouser 
查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-newer file1 ! file2 

查找更改时间比文件file1新但比文件file2旧的文件。
-type 

查找某一类型的文件,诸如:

b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。

-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。

-mount:在查找文件时不跨越文件系统mount点。
-follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。
另外,下面三个的区别:
   -amin n
  查找系统中最后N分钟访问的文件

  -atime n
  查找系统中最后n*24小时访问的文件

  -cmin n
  查找系统中最后N分钟被改变文件状态的文件

  -ctime n
  查找系统中最后n*24小时被改变文件状态的文件

    -mmin n
  查找系统中最后N分钟被改变文件数据的文件

  -mtime n
  查找系统中最后n*24小时被改变文件数据的文件

4、使用exec或ok来执行shell命令
使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的
在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。
exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。
例如:为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec选项中
# find . -type f -exec ls -l {  } \;
-rw-r--r--    1 root     root        34928 2003-02-25  ./conf/httpd.conf
-rw-r--r--    1 root     root        12959 2003-02-25  ./conf/magic
-rw-r--r--    1 root     root          180 2003-02-25  ./conf.d/README
上面的例子中,find命令匹配到了当前目录下的所有普通文件,并在-exec选项中使用ls -l命令将它们列出。
在/logs目录中查找更改时间在5日以前的文件并删除它们:
$ find logs -type f -mtime +5 -exec rm {  } \;
记住:在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!当使用诸如mv或rm命令时,可以使用-exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。
在下面的例子中, find命令在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。
$ find . -name "*.conf"  -mtime +5 -ok rm {  } \;
< rm ... ./conf/httpd.conf > ? n
按y键删除文件,按n键不删除。
任何形式的命令都可以在-exec选项中使用。
在下面的例子中我们使用grep命令。find命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个sam用户。
# find /etc -name "passwd*" -exec grep "sam" {  } \;
sam:x:501:501::/usr/sam:/bin/bash

二、find命令的例子;

1、查找当前用户主目录下的所有文件:
下面两种方法都可以使用
$ find $HOME -print
$ find ~ -print


2、让当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件;
$ find . -type f -perm 644 -exec ls -l {  } \;

3、为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径;
$ find / -type f -size 0 -exec ls -l {  } \;

4、查找/var/logs目录中更改时间在7日以前的普通文件,并在删除之前询问它们;
$ find /var/logs -type f -mtime +7 -ok rm {  } \;

5、为了查找系统中所有属于root组的文件;
$find . -group root -exec ls -l {  } \;
-rw-r--r--    1 root     root          595 10月 31 01:09 ./fie1

6、find命令将删除当目录中访问时间在7日以来、含有数字后缀的admin.log文件。
该命令只检查三位数字,所以相应文件的后缀不要超过999。先建几个admin.log*的文件 ,才能使用下面这个命令
$ find . -name "admin.log[0-9][0-9][0-9]" -atime -7  -ok
rm {  } \;
< rm ... ./admin.log001 > ? n
< rm ... ./admin.log002 > ? n
< rm ... ./admin.log042 > ? n
< rm ... ./admin.log942 > ? n

7、为了查找当前文件系统中的所有目录并排序;
$ find . -type d | sort

8、为了查找系统中所有的rmt磁带设备;
$ find /dev/rmt -print

三、xargs
xargs - build and execute command lines from standard input
在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。
find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;
而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
来看看xargs命令是如何同find命令一起使用的,并给出一些例子。
下面的例子查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件
#find . -type f -print | xargs file
./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text
./.kde/Autostart/.directory:      ISO-8859 text\
......
在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:
$ find / -name "core" -print | xargs echo "" >/tmp/core.log
上面这个执行太慢,我改成在当前目录下查找
#find . -name "file*" -print | xargs echo "" > /temp/core.log
# cat /temp/core.log
./file6
在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限:
# ls -l
drwxrwxrwx    2 sam      adm          4096 10月 30 20:14 file6
-rwxrwxrwx    2 sam      adm             0 10月 31 01:01 http3.conf
-rwxrwxrwx    2 sam      adm             0 10月 31 01:01 httpd.conf

# find . -perm -7 -print | xargs chmod o-w
# ls -l
drwxrwxr-x    2 sam      adm          4096 10月 30 20:14 file6
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 http3.conf
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 httpd.conf
用grep命令在所有的普通文件中搜索hostname这个词:
# find . -type f -print | xargs grep "hostname"
./httpd1.conf:#     different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your
用grep命令在当前目录下的所有普通文件中搜索hostnames这个词:
# find . -name \* -type f -print | xargs grep "hostnames"
./httpd1.conf:#     different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your
注意,在上面的例子中, \用来取消find命令中的*在shell中的特殊含义。
find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。

四、find 命令的参数
下面是find一些常用参数的例子,有用到的时候查查就行了,像上面前几个贴子,都用到了其中的的一些参数,也可以用man或查看论坛里其它贴子有find的命令手册

1、使用name选项
文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。
可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。
不管当前路径是什么,如果想要在自己的根目录$HOME中查找文件名符合*.txt的文件,使用~作为 'pathname'参数,波浪号~代表了你的$HOME目录。
$ find ~ -name "*.txt" -print
想要在当前目录及子目录中查找所有的‘ *.txt’文件,可以用:
$ find . -name "*.txt" -print
想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:
$ find . -name "[A-Z]*" -print
想要在/etc目录中查找文件名以host开头的文件,可以用:
$ find /etc -name "host*" -print
想要查找$HOME目录中的文件,可以用:
$ find ~ -name "*" -print 或find . -print
要想让系统高负荷运行,就从根目录开始查找所有的文件。
$ find / -name "*" -print
如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是.txt的文件,下面的命令就能够返回名为ax37.txt的文件:
$find . -name "[a-z][a-z][0--9][0--9].txt" -print

2、用perm选项
按照文件权限模式用-perm选项,按文件权限模式来查找文件的话。最好使用八进制的权限表示法。
如在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:
$ find . -perm 755 -print
还有一种表达方法:在八进制数字前面要加一个横杠-,表示都匹配,如-007就相当于777,-006相当于666
# ls -l
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 http3.conf
-rw-rw-rw-    1 sam      adm         34890 10月 31 00:57 httpd1.conf
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 httpd.conf
drw-rw-rw-    2 gem      group        4096 10月 26 19:48 sam
-rw-rw-rw-    1 root     root         2792 10月 31 20:19 temp

# find . -perm 006
# find . -perm -006
./sam
./httpd1.conf
./temp
-perm mode:文件许可正好符合mode
-perm +mode:文件许可部分符合mode
-perm -mode: 文件许可完全符合mode

3、忽略某个目录
如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用-prune选项来指出需要忽略的目录。在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。
如果希望在/apps目录下查找文件,但不希望在/apps/bin目录下查找,可以用:
$ find /apps -path "/apps/bin" -prune -o -print

4、使用find查找文件的时候怎么避开某个文件目录
比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件
find /usr/sam -path "/usr/sam/dir1" -prune -o -print
find [-path ..] [expression] 在路径列表的后面的是表达式
-path "/usr/sam" -prune -o -print 是 -path "/usr/sam" -a -prune -o
-print 的简写表达式按顺序求值, -a 和 -o 都是短路求值,与 shell 的 && 和 || 类似如果 -path "/usr/sam" 为真,则求值 -prune , -prune 返回真,与逻辑表达式为真;否则不求值 -prune,与逻辑表达式为假。如果 -path "/usr/sam" -a -prune 为假,则求值 -print ,-print返回真,或逻辑表达式为真;否则不求值 -print,或逻辑表达式为真。
这个表达式组合特例可以用伪码写为
if -path "/usr/sam"  then
          -prune
else
          -print
避开多个文件夹
find /usr/sam \( -path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -print
圆括号表示表达式的结合。
\ 表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。
查找某一确定文件,-name等选项加在-o 之后
#find /usr/sam  \(-path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -name "temp" -print

5、使用user和nouser选项
按文件属主查找文件,如在$HOME目录中查找文件属主为sam的文件,可以用:
$ find ~ -user sam -print
在/etc目录下查找文件属主为uucp的文件:
$ find /etc -user uucp -print
为了查找属主帐户已经被删除的文件,可以使用-nouser选项。这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时,不必给出用户名; find命令能够为你完成相应的工作。
例如,希望在/home目录下查找所有的这类文件,可以用:
$ find /home -nouser -print

6、使用group和nogroup选项
就像user和nouser选项一样,针对文件所属于的用户组, find命令也具有同样的选项,为了在/apps目录下查找属于gem用户组的文件,可以用:
$ find /apps -group gem -print
要查找没有有效所属用户组的所有文件,可以使用nogroup选项。下面的find命令从文件系统的根目录处查找这样的文件
$ find / -nogroup-print

7、按照更改时间或访问时间等查找文件
如果希望按照更改时间来查找文件,可以使用mtime,atime或ctime选项。如果系统突然没有可用空间了,很有可能某一个文件的长度在此期间增长迅速,这时就可以用mtime选项来查找这样的文件。
用减号-来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的文件。
希望在系统根目录下查找更改时间在5日以内的文件,可以用:
$ find / -mtime -5 -print
为了在/var/adm目录下查找更改时间在3日以前的文件,可以用:
$ find /var/adm -mtime +3 -print

8、查找比某个文件新或旧的文件
如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用-newer选项。它的一般形式为:
newest_file_name ! oldest_file_name
其中,!是逻辑非符号。
查找更改时间比文件sam新但比文件temp旧的文件:
例:有两个文件
-rw-r--r--    1 sam      adm             0 10月 31 01:07 fiel
-rw-rw-rw-    1 sam      adm         34890 10月 31 00:57 httpd1.conf
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 httpd.conf
drw-rw-rw-    2 gem      group        4096 10月 26 19:48 sam
-rw-rw-rw-    1 root     root         2792 10月 31 20:19 temp

# find -newer httpd1.conf  ! -newer temp -ls
1077669    0 -rwxrwxr-x   2 sam      adm             0 10月 31 01:01 ./httpd.conf
1077671    4 -rw-rw-rw-   1 root     root         2792 10月 31 20:19 ./temp
1077673    0 -rw-r--r--   1 sam      adm             0 10月 31 01:07 ./fiel
查找更改时间在比temp文件新的文件:
$ find . -newer temp -print


9、使用type选项
在/etc目录下查找所有的目录,可以用:
$ find /etc -type d -print
在当前目录下查找除目录以外的所有类型的文件,可以用:
$ find . ! -type d -print
在/etc目录下查找所有的符号链接文件,可以用
$ find /etc -type l -print

10、使用size选项
可以按照文件长度来查找文件,这里所指的文件长度既可以用块(block)来计量,也可以用字节来计量。以字节计量文件长度的表达形式为N c;以块计量文件长度只用数字表示即可。
在按照文件长度查找文件时,一般使用这种以字节表示的文件长度,在查看文件系统的大小,因为这时使用块来计量更容易转换。
在当前目录下查找文件长度大于1 M字节的文件:
$ find . -size +1000000c -print
在/home/apache目录下查找文件长度恰好为100字节的文件:
$ find /home/apache -size 100c -print
在当前目录下查找长度超过10块的文件(一块等于512字节):
$ find . -size +10 -print

11、使用depth选项
在使用find命令时,可能希望先匹配所有的文件,再在子目录中查找。使用depth选项就可以使find命令这样做。这样做的一个原因就是,当在使用find命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。
在下面的例子中, find命令从文件系统的根目录开始,查找一个名为CON.FILE的文件。
它将首先匹配所有的文件然后再进入子目录中查找。
$ find / -name "CON.FILE" -depth -print

12、使用mount选项
在当前的文件系统中查找文件(不进入其他文件系统),可以使用find命令的mount选项。
从当前目录开始查找位于本文件系统中文件名以XC结尾的文件:
$ find . -name "*.XC" -mount -print


五、关于本文
本文是find 命令的详细说明,可贵的是针对参数举了很多的实例,大量的例证,让初学者更为容易理解;本文是zhy2111314兄贴在论坛中;我对本文进行了再次整理,为方便大家阅读; ── 北南南北