首页 > 代码库 > find命令小结

find命令小结

find命令小结

find命令用于在系统中查找文件,配合 -exec 选项或 xargs命令还能对查找到得文件执行一些列的自动化操作。

基本格式:find [-H] [-L] [-P] [path...] [expression]

path指定起始搜索路径,可以指定多个,exprssion表示搜索表达式,包含选项及选项参数。

[TOC]

表达式

-depth n (mac os): 指定只遍历深度为 n 的目录(相对起始目录),例如 1 表示只在当前目录搜索,2 表示只在当前目录的子目录中搜索,以此类推。

-maxdepth n: 指定最大遍历深度为 n。

-maxdepth n: 指定最小遍历深度为 n。

-name pattern: 搜索文件名匹配 pattern 的文件,例如 ‘*.txt‘ 匹配所有以 ‘.txt‘ 结尾的文件。

-path pattern: 搜索路径名匹配 pattern 的文件。

-type t: 搜索文件类型为 t 的文件。t 的可选值为:

    b  block special(块设备文件)
    c  character special(字符设备文件)
    d  directory(目录)
    f  regular file(普通文件)
    l  symbolic link(符号链接)
    p  FIFO(管道)
    s  socket(套接字)

-ls: 输出结果包括权限,大小,路径,创建者,创建时间等信息,类似命令 ls -dgils的输出结果。

i 前缀: 有很多带 i 前缀的选项,表示忽略大小写。例如 -iname-ilname, -ipath, -iregex, -inum等。

-exec command [argument ...] ;: 执行命令 command,执行的上下文路径为搜索起始路径,这个表达式必须已分号结束。command可以带多个参数,如果命令名字或者参数名字出现 ‘{}‘ ,‘{}‘将会被当前文件的路径代替。需要注意的是在shell中执行此命令的时候,需要转义分号,可以用引号引号引起来或者在分号前面加 “\”号。

-execdir command [argument ...] ;: 同 -exec,区别是执行命令的上下文路径是当前文件所在的路径。

关于输出

输出的文件路径格式跟指定的起始路径格式相关,如果起始路径的格式是相对路径,输出的结果就是相对路径,如果起始路径是绝对路径,输出的结果也是绝对路径。

$ pwd
/tmp
$ find . -name ‘*.txt‘
./1.txt
./2.txt
./3.txt
$ find /tmp -name ‘*.txt‘
/tmp/1.txt
/tmp/2.txt
/tmp/3.txt

基本用法举例

使用 ‘-exec‘ 执行自动化操作

  • 把找出的文件拷贝到另外一个目录

    # 先创建几个文件和目录
    $ touch 1.txt 2.txt 3.txt
    $ mkdir xxx
    
    $ find . -maxdepth 1 -name ‘*.txt‘ -exec cp {} xxx \;
    $ ls xxx
    1.txt   2.txt   3.txt
    
    # 这个更有趣,只要出现{}的地方都被当前文件的路径替换掉
    $ find . -maxdepth 1 -name ‘*.txt‘ -exec cp {} xxx/{}.bak \;
    $ ls xxx
    1.txt       1.txt.bak   2.txt       2.txt.bak   3.txt       3.txt.bak
    
    # 创建目录也可以这样
    $ rm -rf xxx
    $ makdir xxx && find . -maxdepth 1 -name ‘*.txt‘ -exec cp {} xxx \;
    $ ls xxx
    1.txt   2.txt   3.txt
    

注意的是,当把文件拷贝到 xxx 目录后,find 继续找 xxx目录下的 .txt 文件,然后执行拷贝,相当于:

$ cp xxx/1.txt xxx/1.txt

因为是同一个文件,所以会打印出警告信息,这里用 “-maxdepth 1” 指定只在起始目录查找,从而避免在 xxx 目录中查找。