linux的五个查找命令

简介: 使用电脑的时候,经常需要查找文件。在Linux中,有很多方法可以做到这一点。国外网站LinuxHaxor总结了五条命令,你可以看看自己知道几条。大多数程序员,可能经常使用其中的2到3条,对这5条命令都很熟悉的人应该是不多的。
使用电脑的时候,经常需要查找文件。
在Linux中,有很多方法可以做到这一点。国外网站LinuxHaxor总结了五条命令,你可以看看自己知道几条。大多数程序员,可能经常使用其中的2到3条,对这5条命令都很熟悉的人应该是不多的。

1. find
find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件。
find的使用格式如下:
  $ find
  - : 所要搜索的目录及其所有子目录。默认为当前目录。
  - : 所要搜索的文件的特征。
  - : 对搜索结果进行特定的处理。
如果什么参数也不加,find默认搜索当前目录及其子目录,并且不过滤任何结果(也就是返回所有文件),将它们全都显示在屏幕上。
find的使用实例:
  $ find . -name 'my*'
搜索当前目录(含子目录,以下同)中,所有文件名以my开头的文件。
  $ find . -name 'my*' -ls
搜索当前目录中,所有文件名以my开头的文件,并显示它们的详细信息。
  $ find . -type f -mmin -10
搜索当前目录中,所有过去10分钟中更新过的普通文件。如果不加-type f参数,则搜索普通文件+特殊文件+目录。
    $ find / -type f -size +100M
查找系统中所有大于100M的文件
说明: 如果你要寻找一个档案的话,那么使用 find 会是一个不错的主意。不过,由于 find 在寻找数据的时候相当的耗硬盘,所以没事情不要使用 find 啦!有更棒的指令可以取代呦,那就是 whereis 与 locate 咯~
    更详细的解释如下
   功能描述

find命令在文件系统中查找文件

命令格式
find  [path ...] [option] [-exec | -ok | -print]

find 命令的参数
path    find命令所查找的目录路径。
-exec   find命令对查找到的每一个匹配文件执行一个shell命令,命令格式为 "-exec command {} /;",
        注意“{}”和“/;”之间有一个空格,最后的“;“也不要忘了。
-ok     和-exec的作用相同,只是在执行命令之前请求用户确认,更安全的执行命令。
-print  将查找到的文件输出到标准输出。

例1:查到/tmp目录下所有扩展名为".tmp"的文件并删除。
[bugboy@bugboy test]$ find /tmp -name "*.tmp" -exec rm {} /;
这里用到了一个-name选项,是指按文件名查找,后面我将会对它进行说明。

命令选项
-name      按照文件名查找文件。
-perm       按照文件权限来查找文件。
-user        按照文件属主来查找文件。
-group     按照文件所属的组来查找文件。
-mtime -n +n  按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。
              find命令还有-atime和-ctime选项,它们和-mtime选项类似。
-nogroup   查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser    查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-newer file1 ! -newer 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小时被改变文件数据的文件

例2:查找当前目录下的块设备文件
[bugboy@bugboy dev]$ find . -type b
./fd0H720
./fd0H360
./fd0H1440
./fd0D720

这里省略掉了部份结果。

例3:查找当前目录下5天以内修改过的文件
[bugboy@bugboy test]$ find . -mtime -5
.
./toto.s
./toto.c
./tookit
./over
./over.s
./over.c
./tookit.c

例3:查找当前目录下比stat.c文件新,比over.c文件旧的文件
[bugboy@bugboy test]$ find . -newer stat.c ! -newer over.c
./toto.s
./crypt
./test
./toto.c
./strtok
./foo.h
./fstatvfs
./strsep.c

例4:查找当前目录下,具有644(用户可读、写,组可读,其它用户可读)权限的文件
[bugboy@bugboy test]$ find . -perm 644
./auto/gnip-1.0.tar.gz
./auto/gnip.o
./auto/.deps/gnip.Po

find命令与xargs命令相结合使用

在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。

find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;

而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

例5:查找当前目录下所有的.c文件,并在文件中搜索stat字符串,输出包含stat的行和行号
[bugboy@bugboy test]$ find . -name "*.c" | xargs grep -n stat
./stat.c:3:#include
./stat.c:5:#include
./stat.c:9:    struct statvfs fsd;
./stat.c:11:    statvfs("/", &fsd);
./fstatvfs.c:2:#include
./fstatvfs.c:4:#include
./fstatvfs.c:10:    struct statvfs vfs;
./fstatvfs.c:14:    if (fstatvfs(fd, &vfs) ./fstatvfs.c:15:        fprintf(stderr, "fstatvfs error()./n");
./statl.c:2:#include
./statl.c:8:    struct stat statbuf;
./statl.c:15:    stat(argv[1], &statbuf);
./statl.c:16:    if (S_ISDIR(statbuf.st_mode)) {
./statl.c:18:    } else if (S_ISBLK(statbuf.st_mode)) {
./test.c:7:static int get_netmask_len(const char *netmask)


2. locate
locate命令其实是“find -name”的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
locate命令的使用实例:
  $ locate /etc/sh
搜索etc目录下所有以sh开头的文件。
  $ locate ~/m
搜索用户主目录下,所有以m开头的文件。
  $ locate -i ~/m
搜索用户主目录下,所有以m开头的文件,并且忽略大小写。

3. whereis
whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。
whereis命令的使用实例:
  $ whereis grep

4. which
which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
which命令的使用实例:
  $ which grep

5. type
type命令其实不能算查找命令,它是用来区分某个命令到底是由shell自带的,还是由shell外部的独立二进制文件提供的。如果一个命令是外部命令,那么使用-p参数,会显示该命令的路径,相当于which命令。
type命令的使用实例:
  $ type cd
系统会提示,cd是shell的自带命令(build-in)。
  $ type grep
系统会提示,grep是一个外部命令,并显示该命令的路径。
  $ type -p grep
加上-p参数后,就相当于which命令。
目录
相关文章
|
1天前
|
Ubuntu 前端开发 Linux
Linux apt 命令
10月更文挑战第1天
12 4
|
1天前
|
缓存 前端开发 Linux
Linux yum 命令
10月更文挑战第1天
14 2
|
2天前
|
设计模式 Unix Linux
Linux系统命令技巧
Linux系统命令技巧
14 3
|
4天前
|
Linux
Linux的cp命令如何使用?
Linux的cp命令如何使用?
14 5
|
1天前
|
关系型数据库 MySQL Unix
【Linux】常用的命令
【Linux】常用的命令
7 1
|
8天前
|
Linux
Linux常用命令包括
Linux常用命令包括
17 5
|
8天前
|
Linux
Linux命令
Linux命令
19 5
|
4天前
|
安全 Linux Shell
常见的 Linux 命令大全(表格形式)
常见的 Linux 命令大全(表格形式)
|
12天前
|
Linux Python Perl
Linux命令删除文件里的字符串
Linux命令删除文件里的字符串
28 7
|
12天前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余