linux/unix命令详解之find

Comments: No Comments
Published on: 2012 年 02 月 13 日

一:功能说明:

1、主要用于寻找文件或目录

2、语法:find [path...] [expression]

第一个参数开始于‘-’, ‘(’, ‘)’, ‘,’ 或 ‘!’,任何这些符号之前的内容都是path部分,之后的是expression部分。

二:expression部分说明:

1、选项:所有的选项都会返回true,他们一般都是限制性的选项,需要对搜寻起影响,所以一般把他们放在expression开始的地方。

  • -daystart 测量时间(for -amin, -atime, -cmin, -ctime, -mmin, and -mtime),从今天开始并非从24小时前。
  • -depth 先处理目录内的内容,最后才是目录本身。类似深搜
  • -follow 不跟踪连接文件,同-noleaf
  • -help --help
  • -maxdepth N 后接正整数,从0开始。表示深搜层数
  • mindepth N 只搜出深度最少为N的路径或文件
  • -mount 不搜寻其他文件系统,同-xdev
  • -noleaf 不去考虑目录至少需拥有两个硬连接存在
  • -version --version
  • -xdev

2、测试项:(后跟数值参数:+n [大于n] -n [小于n] 或n [ 等于n])

  • -amin n(或+n -n数值参数都可以使用+-前缀) 最后n分钟前访问的文件
  • -atime n 最后n天前访问的文件
  • -anewer file 访问文件的时间最接近file文件时间的文件。如果你对这个不太理解请参看这篇文章内“使用touch更新修改时间”部分的讲解,很有用。该命令被-follow影响只有在-follow命令前于该命令
  • -cmin n 过去n分钟改变过的文件
  • -ctime n 过去n天
  • -cnewer file 搜寻过去改变时间接近file时间戳的文件,不理解同看这篇。该命令被-follow影响只有在-follow命令前于该命令。
  • -empty 文件是空的,要么是一个正常的文件或目录。
  • -false 将find命令返回值设置为false,之前有说find返回值一直是true。
  • fstype type 只寻找该文件系统类型下的文件或目录。 有效的文件系统在各个linux/unix版本有较大不同,一个不完全列表:ufs,4.2,4.3,nfs,tmp,mfs,s51k.你可以使用-printf 的%F来看你的文件系统类型。
  • -gid n 属于群组号位n的文件
  • -group name 属于群组名为name的文件,数值也是允许的。
  • -ilname pattern 匹配pattern的文件,此参数的效果和指定"-lname"参数类似,但忽略字符大小写的差别。
  • -iname pattern 类似-name,同样忽略大小写
  • -inum n 查找符合指定的inode编号为n的文件或目录。
  • -ipath pattern 类似-path,不敏感大小写
  • -iregex pattern 类似-regex 匹配忽略大小写
  • -links n 查找硬连接数为n的目录
  • -lname pattern 匹配符号链接文件,/ . 在pattern里不为特别符号。
  • -mmin n 指定时间分钟被修改的文件
  • -mtime n 指定时间天被修改的文件
  • -name pattern 指定字符串作为寻找文件或目录的范本样式。 匹配到某个文件或路径,其前导路径被移除后进行匹配。元字符'*' '?' '[]' 不匹配 '.' 在开始的基础名字。To ignore a directory and the files under it, use -prune;
  • newer file 查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录。 被-follow影响只有在follow参数在前边的时候。
  • -nouser 找出不属于本地主机用户识别码的文件或目录。
  • -nogroup 找出不属于本地主机用户组识别码的文件或目录。
  • -path pattern 指定字符串作为寻找目录的范本样式。 同样不特别解释'\'和'.'。使用-prune 会忽略匹配整个路径树而只匹配文件名或目录名。
  • -perm mode 查找符合指定的权限数值的文件或目录。 mode可以有前缀+和-。
  • -regex pattern 这是一个常规的表达式pattern的正则匹配,针对整个路径树进行匹配。
  • -size n[cwbkMG] 查找符合指定的文件大小的文件。

The following suffixes can be used:
‘b’    for 512-byte blocks (this is the default if no suffix is used)
‘c’    for bytes
‘w’    for two-byte words
‘k’    for Kilobytes (units of 1024 bytes)
The size does not count indirect blocks, but it does count blocks in sparse  files  that  are  not  actually allocated.   Bear  in  mind  that the ‘%k’ and ‘%b’ format specifiers of -printf handle sparse files differently.  The ‘b’ suffix always denotes 512-byte blocks and never 1 Kilobyte blocks, which is different to the  behaviour of -ls.

  • -true  命令返回值为true
  • -type c  查找文件类型为c的。

File is of type c:
b      block (buffered) special
c      character (unbuffered) special
d      directory
p      named pipe (FIFO)
f      regular file
l      symbolic link
s      socket
D      door (Solaris)

  • -uid n 查找符合指定的用户识别码的文件或目录。
  • -used n 查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算。
  • -user uname 用户uname的文件或目录,数值也是被允许的。
  • -xtype c 同-type除了file为符号链接时。当为符号链接时:如果-follow没有被给出,链接文件类型为c时返回true;如果-follow给出,如果类型c的值为'l'则返回true。
  • -context scontext SELinux特有,文件包含scontext。

3、执行项:

  • -exec command;  执行command命令,如果退出码为0则返回true,蚕食为所有find返回值。命令到分号;结束。find命令里的{}意指替换找到的文件名称至命令。但是不建议使用该参数,具体原因参看这篇文章这篇文章。在两个页面内搜寻exec关键字,有两条原因不推荐该选项。1、耗系统资源;2、参数可能过长导致报错。替代办法两篇文章内有说,使用xargs命令。
  • -fls file 此参数的效果和指定"-ls"参数类似,但会把结果保存为指定的列表文件。
  • -fprint file 此参数的效果和指定"-print"参数类似,但会把结果保存成指定的列表文件。 如果文件不存在,则会创建file,如果文件存在则删除原文件。
  • -print 结果输出
  • -ok 类似-exec,区别在于执行前询问用户

以上内容纯manual翻译而来。基本上这个find命令还是没那么多变化,不像sed和awk那样复杂,只是命令参数多一点而已。实例的话,给大家整理一部分粘贴过来好了。

三:实例:

$find   ~   -name   "*.txt"   -print    #在$HOME中查.txt文件并显示
$find   .    -name   "*.txt"   -print
$find   .    -name   "[A-Z]*"   -print   #查以大写字母开头的文件
$find   /etc   -name   "host*"   -print #查以host开头的文件
$find   .   -name   "[a-z][a-z][0–9][0–9].txt"    -print   #查以两个小写字母和两个数字开头的txt文件
$find .   -perm   755   -print
$find   .   -perm -007   -exec ls -l {} \;   #查所有用户都可读写执行的文件同-perm 777
$find   . -type d   -print
$find   .   !   -type   d   -print
$find   .   -type l   -print
$find   .   -size   +1000000c   -print        #查长度大于1Mb的文件
$find   .   -size   100c         -print       # 查长度为100c的文件
$find   .   -size   +10   -print              #查长度超过期作废10块的文件(1块=512字节)

$cd /
$find   etc   home   apps    -depth   -print   | cpio   -ivcdC65536   -o   /dev/rmt0
$find   /etc -name "passwd*"   -exec grep   "cnscn"   {}   \;   #看是否存在cnscn用户
$find . -name "yao*"   | xargs file
$find   . -name "yao*"   |   xargs   echo    "" > /tmp/core.log
$find   . -name "yao*"   | xargs   chmod   o-w
find   -name april*                    # 在当前目录下查找以april开始的文件
find   -name   april*   fprint file       # 在当前目录下查找以april开始的文件,并把结果输出到file中
find   -name ap* -o -name may*   #查找以ap或may开头的文件
find   /mnt   -name tom.txt   -ftype vfat  # 在/mnt下查找名称为tom.txt且文件系统类型为vfat的文件
find   /mnt   -name t.txt ! -ftype vfat   #在/mnt下查找名称为tom.txt且文件系统类型不为vfat的文件
find   /tmp   -name wa* -type l           # 在/tmp下查找名为wa开头且类型为符号链接的文件
find   /home   -mtime   -2              #   在/home下查最近两天内改动过的文件
find /home    -atime -1                 # 查1天之内被存取过的文件
find /home -mmin    +60                #  在/home下查60分钟前改动过的文件
find /home   -amin   +30                  #查最近30分钟前被存取过的文件
find /home   -newer   tmp.txt           #  在/home下查更新时间比tmp.txt近的文件或目录
find /home   -anewer   tmp.txt          #  在/home下查存取时间比tmp.txt近的文件或目录
find   /home   -used   -2                  #列出文件或目录被改动过之后,在2日内被存取过的文件或目录
find   /home   -user cnscn              #  列出/home目录内属于用户cnscn的文件或目录
find   /home   -uid   +501               #   列出/home目录内用户的识别码大于501的文件或目录
find   /home   -group   cnscn           #   列出/home内组为cnscn的文件或目录
find   /home   -gid 501                 #  列出/home内组id为501的文件或目录
find   /home   -nouser                  #  列出/home内不属于本地用户的文件或目录
find   /home   -nogroup                  # 列出/home内不属于本地组的文件或目录
find   /home    -name tmp.txt    -maxdepth   4  # 列出/home内的tmp.txt 查时深度最多为3层
find   /home   -name tmp.txt   -mindepth   3   #从第2层开始查
find   /home   -empty                     #查找大小为0的文件或空目录
find   /home   -size   +512k              #  查大于512k的文件
find   /home   -size   -512k              # 查小于512k的文件
find   /home   -links   +2               # 查硬连接数大于2的文件或目录
find   /home   -perm   0700               # 查权限为700的文件或目录
find   /tmp   -name tmp.txt   -exec cat {} \;
find   /tmp   -name   tmp.txt   -ok   rm {} \;

find    /   -amin    -10     # 查找在系统中最后10分钟访问的文件
find    /   -atime   -2        # 查找在系统中最后48小时访问的文件
find    /   -empty             # 查找在系统中为空的文件或者文件夹
find    /   -group   cat        # 查找在系统中属于 groupcat的文件
find    /   -mmin   -5         # 查找在系统中最后5分钟里修改过的文件
find    /   -mtime   -1       #查找在系统中最后24小时里修改过的文件
find    /   -nouser           #查找在系统中属于作废用户的文件
find    /   -user    fred     #查找在系统中属于FRED这个用户的文件

#查当前目录下的所有普通文件

find . -type f -exec ls -l {} \;
#在/ l o g s目录中查找更改时间在5日以前的文件并删除它们:
$ find logs -type f -mtime +5 -exec   -ok   rm {} \;#查询当天修改过的文件
find   ./   -mtime   -1   -type f   -exec   ls -l   {} \;

#查询文件并询问是否要显示
find   ./   -mtime   -1   -type f   -ok   ls -l   {} \;
< ls … ./classDB.inc.php > ? y
-rw-r–r–    1 cnscn    cnscn       13709   1月 12 12:22 ./classDB.inc.php
[root@book class]# find   ./   -mtime   -1   -type f   -ok   ls -l   {} \;
< ls … ./classDB.inc.php > ? n

1)在/tmp中查找所有的*.h,并在这些文件中查找“SYSCALL_VECTOR",最后打印出所有包含"SYSCALL_VECTOR"的文件名A) find   /tmp   -name   "*.h"   | xargs   -n50   grep SYSCALL_VECTOR
B) grep   SYSCALL_VECTOR   /tmp/*.h | cut    -d’:'   -f1| uniq > filename
C) find   /tmp   -name "*.h"   -exec grep "SYSCALL_VECTOR"   {}   \; -print2)find / -name filename -exec rm -rf {} \;
find / -name filename -ok rm -rf {} \;

3)比如要查找磁盘中大于3M的文件:
find . -size +3000k -exec ls -ld {} ;

4)将find出来的东西拷到另一个地方
find *.c -exec cp ‘{}’ /tmp ‘;’

如果有特殊文件,可以用cpio,也可以用这样的语法:
find dir -name filename -print | cpio -pdv newdir

6)查找2004-11-30 16:36:37时更改过的文件
# A=`find ./ -name "*php"` |   ls -l –full-time $A 2>/dev/null | grep "2004-11-30 16:36:37"

 

 

个人原创,转载请注明:三江小渡

我猜你可能也喜欢:

No Comments - Leave a comment

Leave a comment

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>


Welcome , today is 星期二, 2017 年 10 月 24 日