find搜索查找指令


大佬文章,请优先查看!!!

linux 中强大且常用命令:find、grep

find 命令


find指令将从指定目录向下递归地遍历其各个子目录,将满足条件的 文件或者目录 显示在终端。

基本语法

#find [起始目录] 寻找条件 操作
find [path...] [expression]

path:find命令所查找的目录路径
expression:expression可以分为——“-options [-print -exec -ok ...]”

-options,指定find命令的常用选项

-print,find命令将匹配的文件输出到标准输出

-exec,find命令对匹配的文件执行该参数所给出的shell命令

-ok,和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行

说明:find命令从指定的起始目录开始,递归地搜索其各个子目录,查找满足寻找条件 的文件并对之采取相关的操作。

该命令提供的寻找条件可以是一个用逻辑运算符 not、and、or 组成的复合条件。逻辑运 算符 and、or、not 的含义为:

(1) and:逻辑与,在命令中用 -a 表示,是系统缺省的选项,表示只有当所给的条 件都满足时,寻找条件才算满足。例如:

find -name 'tmp' -xtype c -user 'inin'
# 该命令寻找三个给定条件都满足的所有文件

(2) or:逻辑或,在命令中用 -o 表示。该运算符表示只要所给的条件中有一个满足 时,寻找条件就算满足。例如:

find -name 'tmp' -o -name 'mina*'
# 该命令查询文件名为 tmp 或是匹配 mina* 的所有文件。

(3) not:逻辑非,在命令中用 ! 表示。该运算符表示查找不满足所给条件的文件 。例如:

find ! -name 'tmp'
# 该命令查询文件名不是 tmp 的所有文件。

需要说明的是:当使用很多的逻辑选项时,可以用括号把这些选项括起来。为了避免 Shell本身对括号引起误解,在话号前需要加转义字符 \ 来去除括号的意义。例:

find \( -name 'tmp' -xtype c -user 'inin' \)

选项

选项 功能
-name 按照指定的文件名查找模式查找文件
-lname '字串' 查找文件名匹配所给字串的所有符号链接文件,字串内可用通配符 *、?、[ ]
-user 查找属于指定用户名所有文件
-perm 权限 查找具有指定权限的文件和目录,权限的表示可以如:711,644
-group 按照文件所属的组来查找文件
-newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件
-type 查找某一类型的文件,诸如:
b - 块设备文件
d - 目录
c - 字符设备文件
p - 管道文件
l - 符号链接文件
f - 普通文件
s - socket文件
-size n[bckw] 查找指定文件大小的文件,n 后面的字符表示单位,缺省为 b,代表512字节的块
-gid n 查找属于ID号为 n 的用户组的所有文件
-uid n 查找属于ID号为 n 的用户的所有文件
-empty 查找大小为 0的目录或文件
-path '字串' 查找路径名匹配所给字串的所有文件,字串内可用通配符 *、?、[ ]
-ls 详细列出所找到的所有文件
-fprintf 文件名 将找到的文件名写入指定文件
-print 在标准输出设备上显示查找出的文件名

以时间为条件查找

选项 说明
-amin n 查找n分钟前被访问过的所有文件
-atime n 查找n天前被访问过的所有文件
-cmin n 查找n分钟前文件状态被修改过的所有文件
-ctime n 查找n天前文件状态被修改过的所有文件
-mmin n 查找n分钟前文件内容被修改过的所有文件
-mtime -n | +n 按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前

各个选项中的 n 值可以有三种输入方式,假设 n 为20,则:

+20 表示20以后(21,22,23等)
-20 表示20以前(19,18,17等)
20 表示正好是20

举个🌰

  • 按文件名:根据名称查找/home目录下的hello.txt文件 (支持通配符)

  • 按拥有者:查找/opt目录下,用户名称为nobody的文件

  • 查找整个linux系统下大于20M的文件(+n大于、-n小于、n等于)

  • 在目录下找后缀是.MySQL的文件
find /home/eagleye -name '*.mysql' -print
  • 从 /usr 目录开始往下找,找最近3天之内存取过的文件
find /usr -atime 3 –print
  • 从 /usr 目录开始往下找,找最近5天之内修改过的文件
find /usr -ctime 5 –print
  • 从 /doc 目录开始往下找,找拥有者是 jacky 的,文件名开头是' j '的文件
find /doc -user jacky -name 'j*'print
  • 从 /doc 目录开始往下找,找寻文件名是 ja 开头或者 ma开头的文件
find /doc ( -name 'ja*' -o- -name 'ma*' ) –print
  • 从 /doc 目录开始往下找,找到凡是文件名结尾为 bak的文件,把它删除掉。-exec 选项是执行的意思,rm 是删除命令,{ } 表示文件名,“;”是规定的命令结尾
find /doc -name '*bak' -exec rm {} ;
  • 在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其它用户可以读、执行的文件
find . -perm 755 –print
  • 在/apps目录下查找属于gem用户组的文件
find /apps -group gem –print
  • 在系统根目录下查找更改时间在5日以内的文件
find / -mtime -5 –print
  • 在/var/adm目录下查找更改时间在3日以前的文件
find /var/adm -mtime +3 –print
  • 在/etc目录下查找所有的目录
find /etc -type d –print
  • 在当前目录下查找除目录以外的所有类型的文件
find . ! -type d –print
  • 在/etc目录下查找所有的符号链接文件
find /etc -type l –print
  • 在当前目录下查找文件长度大于1 M字节的文件
find . -size +1000000c –print
  • 在/home/apache目录下查找文件长度恰好为100字节的文件
find /home/apache -size 100c –print
  • 在当前目录下查找长度超过10块的文件(一块等于512字节)
find . -size +10 –print

find与xargs

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

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

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

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

举个🌰

  • 查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件
find . -type f -print | xargs file
  • 在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中
find / -name "core" -print | xargs echo "" >/tmp/core.log
  • 用grep命令在所有的普通文件中搜索hostname这个词
find . -type f -print | xargs grep "hostname"
  • 删除3天以前的所有东西
find ./ -mtime +3 -print|xargs rm -f –r
  • 删除文件大小为零的文件
find ./ -size 0 | xargs rm -f &
posted @   Lz_蚂蚱  阅读(236)  评论(0编辑  收藏  举报
(评论功能已被禁用)
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起