linux文件查找工具-find(详细)

来源:互联网 发布:易名域名批量查询工具 编辑:程序博客网 时间:2024/06/14 01:29

find命令


1. find命令特点

  • 实时查找
  • 文件遍历
  • 精确匹配
  • 可以使用正则表达式模糊查询
  • 速度较慢(缺点)

2. 根据文件名查找

可以使用正则匹配的方式进行模糊查询,查找指定文件夹下的匹配的文件或文件夹。

# 当前目录下的passwd文件find ./ -name "passwd"# 根目录下的以passwd结尾,开头未知的文件find /  -name "*passwd*"# /etc目录下的以shadow开头,结尾位置的文件 find /etc -name "shadow*"# /var目录下的文件名中含有nginx字符串的文件find /var -name "*nginx*"

3. 根据文件的属主属组查找

可以根据文件或文件夹的属主属组查找文件,还可以查找没有属主属组的文件然后进行处理。

  • -user:属主
  • -group:属组
  • -uid:根据文件的uid实现精确查找
  • -gid:根据文件的gid实现精确查找
  • -nouser,-nogroup:对于已经被删除用户名或用户组的文件,系统只会保留相应的gid,uid号码用以标识,而如果此时新建一个用户名就用可能取得某些文件的管理权限,出于安全的考虑,所以要对这些文件进行查找,保证安全
# 当前目录下属主属组都为zhangpf的文件find ./ -group=zhangpf -user=zhangpf # /home/zhangpf目录下属组为zhangpf属组为root,文件名中包含passwd的文件find /home/zhangpf -user=zhangpf -group=root -name "*passwd*"# 根目录下没有属组和属主的文件find / -nouser -nogroup- 没有属组属主的文件,如果当有新的用户添加进来之后,如果新用户的gid或uid跟这些文件原来的gid或uid一样,那么这些文件就会属于这个新的用户,这也是一个安全隐患,一定要注意

4. 根据文件类型进行查找

根据文件类型进行查找:-type [文件类型]

f:普通文件
d:目录文件
l:符号链接文件
s:套接字文件
b:块处理设备文件
c:字符设备文件
p:管道文件

# 查找/tmp下的套接字文件find /tmp -type s# 查找/var下的套接字文件,且文件名中含有sockfind /var -type s -name "*sock*"# 查找/etc下的符号链接文件

5. 根据文件大小进行查找

-size [+或-] [文件大小]
查找比SIZE还要大(+)或者小(-)的文件

文件大小的表示:
c:代表byte,k:代表1024bytes,M:代表1024k,G:表示1024M

# 查找/root下大于100M的文件并用'ls -lh'命令显示其属性find /root -size +100M -print | xargs ls -lh# 查找/root下大于50M且小于100M的文件并列出其属性信息find /root -size +50M -a -size -100M -print | xargs ls -lh

6. 根据文件的时间进行查找

文件的时间有3种,mtime(Modify time,文件内容变更)、ctime(Change time,文件属性变更)、atime(Access time,文件被访问),以下详细介绍

mtime:当文件的“内容数据” 更改时,就会更新这个时间。内容数据指的是文件的内容,而不是文件的属性与权限
ctime:当文件的状态发生变化时,就会更新这个数据,比如:权限与属性发生变化
atime:当文件的内容被读取时,就会更新这个时间

以天为单位查找:-ctime,-atime,-mtime
以分钟为单位查找:-cmin,-amin,-mmin

-newer用在分辨两个文件之间的新旧关系,默认以mtime为准
对比文件的新旧程度查找:-newer,-anewer,-cnewer

+4:代表大于等于五天前的文件名:find /var -mtime +4
-4: 代表小于等于四天内的文件名
4:代表4~5天那一天的文件

示例:

# 从现在开始到24小时之前有过改动的文件全部列出来  find / -mtime 0 # 寻找四天前的那一天被改动的文件  find /var -mtime 4 # 四天之内被改动过的文件find /var -mctime -4# 查找当前文件夹下10分钟之内被修改的文件,并列出ctime信息find . -cmin +10 -print | xargs ls -cl# 寻找/etc下面的文件日期(mtime)比/etc/passwd新的文件find /etc -newer /etc/passwd#查找某个比文件file1新且比file2旧 的文件find ~ -newer test1! test2 -print

7. 根据文件所属的权限查找

根据文件权限进行查询:-prem [option]

  1. -perm mode
    精确查找,文件权限正好等于mode,mode为类似于chmod的属性值
  2. -perm -mode
    每一类对象都必须拥有其指定的权限标准
  3. -perm /mode
    任何一类(u,g,o)对象的权限只要有一位匹配即可

示例:

# 文件属主属组都有写权限的,只要匹配一项就可以find . -perm /u+w,g+w# 文件属主权限为读,或属组权限为读的文件find . -perm /u=w,g=w# 文件属性为220(属组或属主为可执行)的文件find . -perm /220#find . -perm -444 -perm /222 ! -perm /111find . -perm -a+r -perm /a+w ! -perm /a+x

8. 多条件查找

命令的组合用法
- 与:-a
- 或:-o
- 非:-not,-!

9. 其它相关

对于find查找出来的文件或文件夹,有时候需要做一些处理,下面介绍一下相关的命令

9.1. | xargs command ;

例:somecommand |xargs -item command
不带command ,默认的使用echo 输出

用途:
- 1.构造参数列表并运行命令,即将接收的参数传递给后面的command 命令执行
- 2.将多行输入转换为单行 (特殊功效)
优点:
- 1.将输入参数整理后,去除换行符,以一个列表形式处理
- 2.避免参数过长引发的问题,使用xargs -n 参数适当控制,对于经常产生大量输出的命令如find、locate和grep来说非常有用

XARGS 一般是和管道一起使用:

XXcomand  | xargs  -x  comand initial-args

-x 代表选项
选项:
-p:操作具有可交互性,每次执行comand都交互式提示用户选择
-i:-i选项告诉 xargs 可以使用{}代替传递过来的参数, 建议使用-I,其符合POSIX标准
参考:http://blog.csdn.net/hittata/article/details/8021500

# 查找当前文件夹下10分钟之内被修改的文件,并列出ctime信息find . -cmin +10 -print | xargs ls -cl
9.2. -delete:删除查找到的文件
# 查找后显示,然后删除查找到的文件find . -cmin -10 -print -delete
9.3. -fls /path/to/somefile

查找到的文件的长格式信息保存至指定的文件夹

find /var/log -ctime -4 -fls /tmp/test/abc
9.4. -ok command {} \ ;

对查找的文件执行由command指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认,与下面的-exec类似。

9.5. -exec command {} \;

对查找到的每个文件执行由command执行的命令
{}:用于引用查找到的文件名称自身;

注意:find传递查找到的文件至后面指定的命令时,查找到的所有符合的文件一次性传递给后面的命令

find -exec 与xargs 区别
参考:http://blog.csdn.net/hittata/article/details/8021006
例:

find . -name "*.txt" -exec rm {} \;find . -name "*.txt" | xargs rm {} 

-exec
1.参数是一个一个传递的,传递一个参数执行一次rm
2.文件名有空格等特殊字符也能处理
-xargs
1.一次将参数传给命令,可以使用-n控制参数个数
2.处理特殊文件名需要采用如下方式:

find . -name "*.txt" print0 |xargs -0 rm {} 

示例

1.查找/var 目录下属主为root,且属组为mail的所有文件或目录并列出

find /var -user root -group mail -ls

2.查找/usr 目录下不属于root、bin、hadoop的所有文件或目录

find /usr -not -user root -not -user hadoop -not -user bin -lsfind /usr -not \( -user root -o -user hadoop -o -not -user bin \) -ls

3.查找/etc目录下最近一周内其内容修改过,同时属主不为root,也不为hadoop的文件或目录

find /etc -mtime -7 -a -not \( -user root -o -user hadoop \) -ls

4.查找当前系统上没有属主或属组,且最近一周内曾被访问过的文件或目录

find / -ctmie -7 -a -nouser -a nogroup

5.查找/etc目录下大于1M且类型为普通文件的所有文件

find /etc -size +1M -a -type f -ls

6.查找/etc目录下所有用户都没有写权限的文件

find /etc -not -perm /222 -ls

7.查找/etc目录下至少有一类用户没有执行权限的文件

find /etc -not -perm -111 -ls

8.查找/etc/init.d/目录下,所有用户都有执行权限,且其他用户有写权限的文件

find /etc/init.d -prem /113 -ls

9.查找/tmp/test/y目录下在100分钟内修改过的文件,并删除

find /tmp/test/y -cmin -100 -print | xargs /bin/rm -frfind /tmp/test/y -cmin -100 -deletefind /tmp/test/y -cmin -100 -ok rm -fr '{}' \; #需要询问find /tmp/test/y -cmin -100 -exec rm -fr '{}' \;

10.查找/var/log目录下为文件类型且在10分钟内被修改过的文件,并列出

find /var/log -type f -cmin -10 -exec ls -l '{}' \;

11.查找/var/log下的在四天内被修改过的文件并把它们的长格式信息保存至/tmp/test/abc

find /var/log -ctime -4 -fls /tmp/test/abc

12.查找test.c并备份为test.c.bak

find . -name "text.c" -exec cp {} {}.bak \;

13.查找文件名为[]中的任意字符的文件

使用了通配符进行正则匹配

find ./ -name "[ab]"

14.查找目录并列出目录下的文件(为找到的每一个目录单独执行ls命令,执行命令前需要确认)

find ./ -type d -ok ls {} \;

15.查找空文件或空目录

find ./ -empty

16.查找空文件并删除

find ./ -empty -type f -print -delete

17.查找名字符合正则表达式的文件,注意前面的‘.*’(查找到的文件带有目录)

find ./ -regex .*so.*\.gz

18.查找时忽略一个目录或者多个目录

find ./ ! -path "./output/*" ! -path "./output1/*" -type f | xargs grep ""
原创粉丝点击