1、简介
用于在文件树中查找文件,并作出相应的处理
2、参数
pathname | find命令所查找的目录路径。例如用“.”来表示当前目录,用“/”来表示系统根目录。 |
find命令将匹配的文件输出到标准输出。 | |
-exec | find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } ;,注意{ }和\;之间的空格。 |
-ok | 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。 |
-depth | 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。 |
-name | 按照文件名查找 |
-perm | 按照文件权限来查找 |
-prune | 可用使find命令不在当前制定的目录中查找,如果同时使用-depth选项,那么-prune将被find忽略 |
-user | 按照文件属主查找 |
-group | 按照文件属组查找 |
-nouser | 查找无有效属主的文件 |
-nogroup | 查找无有效属组的文件 |
-newer file1 file2 | 查找更改时间比file1新,但是比file2旧的文件 |
-type | 查找某一类型的文件,诸如:f-普通文件、d-目录、c-字符文件、b-块设备、p-管道文件、l-符号连接 |
-size | [c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计 |
-fstype | 查找属于某一类型文件系统的文件 |
-mount | 查找文件时不跨越文件系统mount点 |
-follow | 如果find命令遇到符号连接文件,就跟踪至连接所指向的文件 |
-cpio | 对匹配的文件使用cpio命令,将文件备份到磁带设备中 |
-mtime -n +n | 按照文件的修改时间来查找,-n文件更改时间距现在n天以内,+n文件更改时间距现在n天以前 |
-amin n | 查找系统中最后n分钟访问的文件 |
-atime n | 查找系统中最后n*24小时访问的文件 |
-cmin n | 查找系统中最后n分钟被改变文件状态的文件 |
-ctime n | 查找系统中最后n*24分钟被改变文件状态的文件 |
-mmin n | 查找系统中最后n分钟被改变文件数据的文件 |
-mtime n | 查找系统中最后n*24小时被改变文件数据的文件 |
3、示例
3.1.查找指定时间内修改过的文件(查找两天内修改过的文件)
find-atime -2
3.2.根据关键字查找(查找当前目录以.log结尾的文件)
find .-name "*.log"
3.3.根据文件权限查找(查找/tmp目录下权限为755的文件)
find/tmp -perm 755
3.4.根据文件类型查找
find . -type d -print #查找当前目录下的目录
find . ! -type d -print #查找当前目录下的非目录
3.5..根据文件大小查找(查找当前目录下大于1k的文件)
find-size +1000c -print
3.6.根据文件名查找
find .-name "*.txt"
3.7.使用exec或ok来执行shell命令
3.7.1.显示当前目录下面所有大于10k的文件,exec后面执行了一个命令,{}代表文件名
find .-type f -size +10k -exec ls -l {} \;
3.7.2.查找/tmp下10天前的文件,删除
find/tmp -type f -mtime +10 -ok rm {} \;
3.7.3.备份配置文件,添加.bak扩展名
find .-name "*.conf" -exec cp {} {}.bak \;
3.7.4.查找主目录下被其他用户写入的文件
find ~-perm -002 -exec chmod o-w {} \;
3.8.-print匹配条件
3.8.1.忽略某个目录(在httpd目录下查找文件但不希望在/httpd/conf目录下查找)
findhttpd -path "httpd/conf" -prune -o -print
3.8.2.匹配多个条件,采用OR条件操作
find .\( -name "*.txt" -o -name "*.conf" \) -print
3.9.xargs命令
有些命令不能接受过多参数,此时命令执行可能会失败,错误信息通常是“参数列太长”或“参数列溢出”,这就是xargs命令的用处所在find | xargs COMMAND
3.9.1.在当前目录下所以普通文件中过滤“nologin”这个词
find .-type f -print |xargs grep "nologin"
3.10.locate命令
查询系统上预建的文件索引数据库,依赖于先构建索引,构建过程需要遍历整个根文件系统,极消耗资源。
工作特点:查找速度快,模糊查找,非实时查找。
-i 执行区分大小写的搜索
-n x 只列举前x个匹配选项
3.11.目录中查找更改时间在5日以前文件并删除
find/logs -type f -mtime +5 -exec rm {} \;
3.12.处理/bin/rm: argument list too long
find/var/spool/clientmqueue -type f -print -exec rm -f {} \;
3.13.否定查找
find .! -name test.txt -print
3.14.合并查找
find .\( -name "*.txt" -o -name "*.py" \) -print
3.15.查询深度
find .-maxdepth 1 -type f - print
3.16.找出/home/user下所有空子目录
find/home/user -maxdepth 1 -type d -empty
3.17.将所有文件名中含有”txt”的文件移入/home/user目录
find-iname "*txt*" -exec mv -v {} /home/user \;
3.18.找出文件名结尾有空格的文件
find .-type f -exec egrep -l " +$" {} \;
3.19.找出文件名有tab缩进符的文件
find .-type f -exec egrep -l $'\t' {} \;
4、补充
find的使用格式如下:
$ find <指定目录> <指定条件> <指定动作>
- <指定目录>: 所要搜索的目录及其所有子目录。默认为当前目录。
- <指定条件>: 所要搜索的文件的特征。
- <指定动作>: 对搜索结果进行特定的处理。
如果什么参数也不加,find默认搜索当前目录及其子目录,并且不过滤任何结果(也就是返回所有文件),将它们全都显示在屏幕上。
find命令用于查找文件和目录,任何位于参数之前的字符串都将被视为欲查找的目录。
find 可以指定查找条件如名称,类型,时间,文件大小,权限和所有者查找,针对多个条件进行与或非的逻辑运算。我们可以控制find的查找的行为,
还可以和其他命令组合使用。
find
find .
find . -print
三者等效, 查找当前目录下所有的文件和目录(递归子目录),以每行一个文件或者目录的形式列举出,不包含隐藏文件
find lib opt bin
同上,查找指定的多个目录(lib/opt/bin)
一、指定查找条件
1) 按名称查找
find . -name readme.txt
查找当前目录下(递归子目录)的所有名为readme.txt的文件
find . -name \*.txt
find . -name "*.txt"
查找当前目录下(递归子目录)的所有名称以.txt结尾的文件,注意*号的写法,需要前面加\或者放到双引号中
find . -iname \*.txt
默认find是区分大小写的,如果不想区分大小写,请使用-iname替代-name,如上则"abc.TXT"将被查找到
2) 按类型查找
find . -type d
查找当前目录下(递归子目录)的所有目录
find . -type f
查找当前目录下(递归子目录)的所有文件
find . -type l
查找当前目录下(递归子目录)的所有符号链接
3) 按时间查找
=====以小时为单位的时间=====
find 命令三个选项用于按照时间查找,单位都是小时:
mtime — 文件内容上次修改时间
atime — 文件被读取或访问的时间
ctime — 文件状态变化时间
这三个选项都需要配置一个n值使用,可以是-n / n / +n:
-n 小于 n
n 正好与 n 相等
+n 大于 n
find . -mtime -1
查找当前目录下(递归子目录)的所有1小时内修改的文件和目录
find . -mtime +1
查找当前目录下(递归子目录)的所有修改时间超过1小时的文件和目录
find . -mtime 1
查找当前目录下(递归子目录)的所有恰好在1小时前修改的文件和目录
=====以分钟为单位的时间=====
用法和*time类似,mmin、amin和cmin 的不同在于单位时间是分钟,用于查找在不到1小时的时间内变化了的文件和目录
find . -mmin -10
查找当前目录下(递归子目录)的所有10分钟内修改的文件和目录
find . -mmin +20
查找当前目录下(递归子目录)的所有20分钟外1小时内修改的文件和目录
=====与特定的文件比较=====
-newer,-anewer和-cnewer选项用于查找与特定的文件比较的已修改或访问过的文件,类似mtime,atime和ctime
-newer 指内容最近被修改的文件
-anewer 指最近被读取过的文件
-cnewer 指状态最近发生变化的文件
find . -newer a.txt
查找当前目录下(递归子目录)的所有修改时间在a.txt之后(所以文件更新)的文件和目录
=====按文件大小查找=====
1. -size 选项用于查找满足指定的大小条件的文件(注意不查找目录), +表示大于, -表示小于, 没有+1表示正好等于。
文件大小的单位可以是字节(用c表示), kb(用k表示)。
find . -size -100c
查找当前目录下(递归子目录)的所有文件大小小于100字节的文件
find . -size +100k
查找当前目录下(递归子目录)的所有文件大小大于100k的文件
find . -size 0
查找当前目录下(递归子目录)的所有文件大小为0的文件
2. -empty 查找空文件和空文件夹, 和-size 0不同的在于-size 0 只查找空文件,或者说-empty -type f 等同于-size 0 :
find . -empty
查找当前目录下(递归子目录)的所有文件大小为0的文件和空文件夹
find . -empty -type f
查找当前目录下(递归子目录)的所有文件大小为0的文件
find . -empty -type d
查找当前目录下(递归子目录)的所有空目录
5) 按权限和所有者查找
find . -perm 777
查找当前目录下(递归子目录)的所有权限为777的文件和目录
find . -perm -u=rwx
查找当前目录下(递归子目录)的所有user权限为rwx的文件和目录
find . -perm -ug=x
查找当前目录下(递归子目录)的所有user和group权限为x的文件和目录
find . -user sky
查找当前目录下(递归子目录)的所有user为sky的文件和目录
find . -group users
查找当前目录下(递归子目录)的所有group为users的文件和目录
二、查找条件的逻辑运算
1. 逻辑与
find . -name "*.java" -size -mmin -10
find . -name "*.java" -a -size -mmin -10
查找当前目录下(递归子目录)的所有名为*.java并且修改时间在10分钟之内的文件,-a是默认选项
2. 逻辑或
find . -name "*.class" -o -name "*.jar"
查找当前目录下(递归子目录)的所有名为*.class或者*.jar的文件和目录
3. 逻辑非
find . ! -user sky
查找当前目录下(递归子目录)的所有user不是sky的文件和目录
三、控制查找的行为
find . -maxdepth 3 -name "*.txt"
查找当前目录下(递归子目录)的所有名为*.txt的文件,目录深度不超过3层
find . -maxdepth 1 -name "*.txt"
查找当前目录下(不递归子目录,因为maxdepth为1)的所有名为*.txt的文件
find . -mindepth 3 -name "*.txt"
查找当前目录下(递归子目录)的所有名为*.txt的文件,目录深度不低于3层
find . -mindepth 1 -name "*.txt"
查找当前目录下的子目录中(递归子目录)的所有名为*.txt的文件,不包含当前目录
find . -depth -name "*.txt"
查找当前目录下(递归子目录)的所有名为*.txt的文件,每个目录都是先在目录中进行查找,然后才继续查找其子目录
四、 find和其他命令的组合
find . -name "*.jar" -exec ls -l {} \;
find . -name "*.jar" -ls
查找当前目录下(递归子目录)的所有*.jar文件并使用ls -l列出详细信息
find . -name "*.java" -exec grep -H -m 1 HashMap {} \;
查找当前目录下(递归子目录)的所有的含有"HashMap"字样的*.java文件
(grep -H -m 1的意思是打印文件名,而且如果文件中有一次匹配就退出,避免多次匹配时为这一个文件打印多行)
find . -name "*.sh" -exec mv {} backup \;
查找当前目录下(递归子目录)的所有的*.sh文件并移动到backup目录中、、、、
========================================
例如经常使用的一个命令场景:
统计代码行数:
find ./ -name "*.[ch]" -o -name "*.cpp" | xargs wc -l
-o:(or)表示两个表达式或的关系。
-a:(and)表示和的关系
xargs将文本内容拆成后面命令的参数。
=======================================
以下列出一些find日常使用的命令场景:
1.当前目录下查找文件
[[email protected] ~]# find . -name test.txt
./findtest/test.txt
2.指定目录下查找
[[email protected] ~]# find /root/ -name test.txt
/root/findtest/test.txt
3.忽略大小写查找
[[email protected] ~]# find /root -iname test.txt
/root/findtest/test.txt
/root/findtest/TEST.txt
4.查找目录
[[email protected] ~]# find / -type d -name test
/usr/lib64/python2.7/unittest/test
/usr/lib64/python2.7/test
/usr/src/kernels/3.10.0-229.14.1.el7.x86_64/include/config/test
/usr/src/kernels/3.10.0-229.14.1.el7.x86_64/lib/raid6/test
5.按名称查找php文件
[[email protected] zabbix]# find . -type f -name events.php
./events.php
6.在目录中查找所有的php文件
[[email protected] zabbix]# find . -type f -name "*.php"
./graphs.php
./tr_logform.php
./authentication.php
./popup_httpstep.php
./image.php
..........
7.查找文件权限是777的
[[email protected] ~]# find . -type f -perm 0777 -print
./findtest/test.txt
8.查找文件权限不是777的
[[email protected] ~]# find . -type f ! -perm 0777 -print
9.查找644权限的SGID文件
[[email protected] ~]# find / -perm 2644
10.查找权限为551的粘着位文件
[[email protected] ~]# find / -perm 1551
11.查找所有SUID文件
[email protected] ~]# find / -perm /u=s
12.查找所有SGID文件
[[email protected] ~]# find / -perm /g+s
13.查找所有只读文件
[[email protected] ~]# find / -perm /u=r
14.查找所有可执行文件
[[email protected] ~]# find / -perm /a=x
15.查找所有777文件,并改为644
反斜杠用来告诉find何时命令结束
[[email protected] ~]# find / -type f -perm 0777 -print -exec chmod 644 {} \;
16.查找所有777的目录,并改为755
[[email protected] ~]# find / -type d -perm 777 -print -exec chmod 755 {} \;
17.查找并删除某个文件
[[email protected] ~]# find . -type f -name "test.txt" -exec rm -f {} \;
18.查找并删除多个文件
[[email protected] ~]# find . -type f -name "*.txt" -exec rm -f {} \;
19.查找所有的空文件
[[email protected] ~]# find /tmp -type f -empty
20.查找所有空目录
[[email protected] ~]# find /tmp -type d -empty
21.查找所有隐藏文件
[[email protected] ~]# find /tmp -type f -name ".*"
22.根据用户查找某个文件
[[email protected] ~]# find / -user root -name test.txt
23.根据用户查找所有的文件
在/home下属于某个用户的所有文件
[[email protected] ~]# find /home -user zabbix
/home/zabbix
/home/zabbix/.bash_history
/home/zabbix/.config
/home/zabbix/.config/abrt
/home/zabbix/mysql-community-release-el7-5.noarch.rpm
/home/zabbix/.lesshst
/home/zabbix/.cache
/home/zabbix/.cache/abrt
/home/zabbix/.cache/abrt/lastnotification
/home/zabbix/.bash_logout
/home/zabbix/.viminfo
/home/zabbix/.mysql_history
/home/zabbix/.bashrc
/home/zabbix/.bash_profile
24./home目录下查找某个组的所有文件
[[email protected] ~]# find /home -group developer
25./home目录下忽略大小写查找用户zabbix的所有文件
[[email protected] ~]# find /home -user zabbix -iname "*.txt"
26.查找50天之内修改过的文件
[[email protected] ~]# find / -mtime 50
27.查找50天之内被存取过的文件
[[email protected] ~]# find / -atime 50
28.查找50-100天之内修改过的文件
[[email protected] ~]# find / -atime +50 -mtime -100
29.查找1个小时之内有变化的文件
[[email protected] ~]# find / -cmin -60
30.查找1个小时之内修改过的文件
[[email protected] ~]# find / -mmin -60
31.查找1个小时之内被存取过的文件
[[email protected] ~]# find / -amin -60
32.查找所有的50M大小的文件
[[email protected] ~]# find / -size 50M
33.查找50-100M之间的文件
[[email protected] ~]# find / -size +50M -size -100M
34.查找并删除100M大小的文件
[[email protected] ~]# find / -size +100M -exec rm -rf {} \;
35.查找并删除指定类型,指定大小的文件
[[email protected] ~]# find / -type f -name *.mp3 -size +10M -exec rm {} \;
标签:文件,常用,name,示例,当前目录,查找,root,find
From: https://blog.51cto.com/zzzhao/6143134