现在的位置: 首页 > 综合 > 正文

Linux之find命令详解

2012年12月02日 ⁄ 综合 ⁄ 共 2081字 ⁄ 字号 评论关闭

在Linux的世界当中,文件查找是最普遍的功能,然后该功能却有着极其复杂的命令与参数相匹配。文件查找有大致三个以下命令:

  • find
  • whereis
  • locate

其中难易程度之首为find,下面我们就来细说下find的命令用法,以及我收集的常用案例。

find命令的基本形式:

find pathname -options [-print -exec -ok]

  • pathname :find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
  • -print :对匹配的文件输出到标准输出,该命令一般会和xargs来搭配使用(在后面我们会说到)。
  • -exec :对匹配的文件执行所给出的shell命令。
  • -ok :与-exec作用相同,只不过以一种更为安全的模式来执行shell命令,例如当执行rm命令的时候,会提示是否删除。

find命令的参数选项:

  • -name  :按照文件名称来查找文件。
  • -perm   :按照文件权限来查找文件。
  • -mtime :按照更改文件数据天数来查找文件。其中附加参数为:n (当前n天)、-n(n天以内)、+n(n天以前)。具体我会在下面的案例来细讲。
  • -mmin  :按照更改文件数据分钟来查找文件。附参数同上。
  • -atime  :按照访问文件天数来查找文件。附参数同上。
  • -amin   :按照访问文件分钟来查找文件。附参数同上。
  • -ctime  :按照更改文件状态天数来查找文件。附参数同上。
  • -cmin   :按照更改文件状态分钟来查找文件。附参数同上。
  • -size     :按照文件大小来查找文件。
  • -depth  :在查找文件时,遍历完当前目录文件邮件后,在对其子目录进行查找。
  • -type     :按照文件类型来查找文件。f - 普通文件、d - 目录、l - 符号链接文件、b - 块设备文件、c - 字符设备文件、p - 管道文件。
  • -newer :比对文件的新旧。
  • -user :根据用户名来查询文件。
  • -maxdepth : 限制查询目录的深度。

-exec 详解

我们查找文件的目的就是为了对其的后续操作,如查看、删除、修改权限等等之类的操作。这就是-exec的作用所在。其中使用-exec时不得不说的两个关键字:{} 与\;。

显示当前目录中,权限为774的所有文件,并显示其相关信息。

# find . -type f -perm 774 -exec ls -l {} \;

  • {}代表的是“由find找到的内容”,如上图所示,find的结果会被放置到{}位置中。
  • -exec一直到“\;”是关键字,代表find额外命令的开始(-exec)到结束(\;),在这中间的就是find命令内的额外命令。就是本例中的“ls -l {}”
  • 因为“;”在bash环境下是有特殊意义的,因此利用反斜杠来转义。

find命令案例:

1、查找当前用户目录下的所有文件

# find $HOME -print
# find ~ -print

2、查找当天所修改过的文件

# find / -type f -mtime 0 -exec ls -l {} \;

以上的命令并不是完全的正确,因为0代表目前的时间。也就是从现在到24小时前。还有就是尽量不要使用/根目录开头,原因应该大家都知道-_-!。

3、查找/var/logs目录中3天前所修改的文件,并删除。

# find /var/logs -type f -mtime +3 -ok rm {} \;

在这里需要说明的有两点,关于时间的 -符号、+符号、和没有符号的区别。

以上的草图我想已经很清楚其区别了。

  • -3  :代表过去3天内。
  • +3 :代表过去3天前。
  • 3   :代表过去3天前的当天。

另一个就是-ok,在使用-ok删除文件的时候,它会询问你是否删除,反之使用-exec的话就直接删除掉了。

4、查找当前目录中文件大于50kb的文件,并显示。

# find . -type f -size +50k -exec ls -l {} \;

  • k :代表1024bytes。
  • c :代笔byte(字节)。
  • +50k :大于50kb的文件。
  • -50k :小于50kb的文件。
  • 50 :等于50kb的文件。

5、查找权限为755的文件,并显示

# find . -perm 755 -exec ls -l {} \;

6、查询后缀txt的目录,且不遍历子目录

# find . -maxdepth 1 -name "*.txt" -exec ls -l {} \;

文件查找之locate

locate [-ir] keyword

  • -i :忽略大小写的差异。
  • -r :后面可接正则表达式。

locate的文件查找要比find命令快。之所以快是因为locate寻找的数据是由已创建的数据库/var/lib/mlocate里面的数据所查找到的,所以不用直接在去硬盘当中访问数据。但locate有其自己的限制。

那么有什么限制呢?就是因为它是经由数据库来查找的,而数据库的创建默认是每天执行一次(每个distribution都不同,CentOS 5.x是每天更新数据库一次),所以当你新建文件后查找该文件,那么locate会告诉你“找不到”。

那是否可以手动更新数据库么?答案当然是可以。

# updatedb

使用上述命令就可以更新数据库。updatedb命令会去读取/etc/updatedb.conf这个配置文件的设置。

抱歉!评论已关闭.