在服务器运维的过程中,我们会用到这样一个命令,关于这个命令,你知道多少呢?接下来,咱们一起来研究一下它的用途。
find命令主要用来在硬盘上搜索文件, find命令主要用于文件查找,列出当前目录及子目录下所有的文件和文件夹
格式:find path -option "keyword" [-print] [-exec -ok command] {} \;
path: 查找路径 ;该命令用于在指定路径中查找符合条件的文件,搜索路径可以是多个目录,不同目录之间用空格分割
-option: 选项
"keyword": 关键字
command: 需要执行的命令
-exec command] {} \;将查到的文件执行command操作,注意{}和\;之间有空格
-ok和-exec的作用一样,只是-ok在执行前会询问用户是否执行操作
find . -name "*" | xargs grep -i "passwd"(自己工作中用的最多的实例,-i的作用是不区分大小写)
find -name "t*" -perm 744 //查找当前目录下文件名以t开头的,且文件属性主具有读、写、执行权限的文件。。。。
find还有-exec选项,对匹配文件执行该参数过给出的shell命令。
例如:find /etc/ -type f -name "rc*" -exec ls -l {} \; //注意{}和\之间有空格。。。
由此可见:可以接多个选项参数
目录路径:表示以此目录作为根目录逐级往下搜索
1.目录介绍:
如果find不指定目录,则默认从当前所在的目录开始搜索
$find
$find .
以上两个结果一样
. 一个点表示当前目录,也可以使用 ./ 来表示;
.. 两个点表示父目录,也可以 ../ 来代表。
如果需要从根目录开始查找:/
find . 遍历输出当前目录下的所有文件(夹)及子文件(夹)
find / 遍历输出根目录下的所有文件(夹)及子文件(夹)
find ./ 遍历输出当前目录的下一级路径的所有文件(夹)及子文件(夹)
也可以是/opt/qmfsun之类的路径
find中的目录可以指定多个搜索目录
$ind /usr /home /tmp -name "*.java";在/usr /home /tmp三个目录中查找以.java结尾的文件
如果对某个目录没有访问权限的话,就会报错,提示: find: /tmp/qmfsun:Permission denide
2. 需要搜索的关键字
3.主要选项参数:
注意:
a)每一个选项前面跟随一个横杠-
$find /doc -name '*bak' -exec rm -rf {} \; //从 /doc 目录开始往下找,找到凡是文件名结尾为 bak的文件,把它删除掉。
注意:-exec 选项是执行的意思,rm -rf是删除命令,{ } 表示文件名,“\;”是规定的命令结尾。
find命令默认情况下是区分大小写的,可以通过-iname或者在grep中添加-i参数来忽略大小写
-name :指定按照文件名查找文件,查找时文件名大小写敏感。只能搜索到文件名,如果需要搜索文件内容里包含的特定字符串,需要用grep(用的最常见)
-iname: 查找时不区分文件名大小写
$ find . -iname U*
users users2
#如果执行find . -name U*将不会找到匹配的文件
find -iname "MyCProgram.c";所有不区分大小写的文件名为“MyCProgram.c”的文件
查找当前用户主目录下的所有文件:下面两种方法都可以使用
$ find . -name "*.log";从当前目录中查找扩展名为.log的文件。需要说明的是,缺省情况下,find会从指定的目录搜索,并递归的搜索其子目录
./install.log
grep差多个字符串
ps -e|grep -E ‘grant_server|commsvr|tcpsvr|dainfo’ 查找多个字符串的匹配(grep -E相当于egrep)
使用grep匹配“与”或者“或”模式
grep命令加- E参数,这一扩展允许使用扩展模式匹配。例如,要抽取城市代码为2 1 9或2 1 6,方法如下:
CODE:
[sam@chenwy sam]$ grep -E '219|216' data.f
219 dec 2CC1999 CAD 23.00 PLV2C 68
216 sept 3ZL1998 USP 86.00 KVM9E 234
find -perm,根据文件的权限来查找文件,有三种形式,是位"与", + /是位"或"
find -perm mode
find -perm -mode
find -perm /mode(+符号的作用与 / 符号相同,但是现在新版 GNU findutils 中不支持使用该符号)
三者区别:
-perm -mode :查找的档案属性『必须要全部囊括 mode 的属性』的档案,举例来说,
我们要查找 -rwxr--r-- ,亦即744 的档案,使用 -perm -744,
当一个档案的属性为 -rwxr-xr-x ,亦即 755时,也会被列出来,
因为 -rwxr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。
-perm +mode :查找档案属性『包含任一 mode 的属性』的档案,举例来说,我们查找
-rwxr-xr-x ,亦即 -perm +755 时,但一个档案属性为 -rw-------
也会被列出來,因為他有 -rw.... 的属性存在
总用量 0
-rwxrwxrwx 1 root root 0 6月 9 20:30 1.txt 777
-rwxrwxr-x 1 root root 0 6月 9 18:58 2.txt 775
-rwxr-xrwx 1 root root 0 6月 10 00:10 3.txt 757
-r-xrwxrwx 1 root root 0 6月 10 00:10 4.txt 577
-r-xr-xrwx 1 root root 0 6月 10 00:10 5.txt 557
-r-xr-xr-x 1 root root 0 6月 10 00:10 6.txt 555
[root@test test1]# find . -perm 700 //没有这个权限的文件
[root@test test1]# find . -perm -700
.
./3.txt
./1.txt
./2.txt
[root@test test1]# find . -perm -712 //2.txt主要是-rwxrwxr-x中的其他用户没有w权限
./3.txt
./1.txt
[root@test test1]# find -perm 755 //也没有这个文件
find -perm +222 //找u或者g或者o三个中,至少一个有可写权限的
find -perm -222 //找u,g和o三个中都有可写的权限文件
find -perm -002 //找权限至少o可以写的
find -perm -222 u g o 全都可写才匹配
-perm按文件权限查找。例如:-perm -777, -perm –a+x(user, group, other 都具有write属性)
find plsql -type f -perm -ug=rw -exec ls -l {} \; 2>/dev/null //将查找可由“other”和组写入的文件
或者
find plsql -type f -perm -220 -exec ls -l {} \; 2>/dev/null
-rw-rw-rw- 1 bluher users 4303 Jun 7 2004 plsql/FORALLSample/doc/otn_new.css
-rw-rw-rw- 1 bluher users 10286 Jan 12 2005 plsql/FORALLSample/doc/readme.html
-rw-rw-rw- 1 bluher users 22647 Jan 12 2005
find plsql -type f -perm /ug=rw -exec ls -l {} \; 2>/dev/null //查找由用户、组或二者共同写入的文件:
或者
find plsql -type f -perm /220 -exec ls -l {} \; 2>/dev/null
-rw-r--r-- 1 bluher users 21473 May 3 16:02 plsql/regexpvalidate.zip
-rw-rw-rw- 1 bluher users 4303 Jun 7 2004 plsql/FORALLSample/doc/otn_new.css
-rw-rw-rw- 1 bluher users 10286 Jan 12 2005 plsql/FORALLSample/doc/readme.html
-rw-rw-rw- 1 bluher users 22647 Jan 12 2005 plsql/FORALLSample/src/config.sql
find /etc -perm 640 精确匹配,其权限必须是640
find /etc -perm /640三组权限中有任意一组匹配都行
find /etc -perm -640含有该权限的都得匹配
-perm -222 可查找出666,只要含有222权限的都可以
-perm -400只要属主有读权限即可,其他任意权限
-perm /400属主有读权限,其他没有任何权限;符合这三组都可
find . -perm 700 是说恰好为 700, rwx------
find . -perm -700 是说第一组满足 7 就可以了,后两组无所谓,因此 rwx------ 和 rwxrwxrwx 都会入选
find . -perm +700 是说第一组每一位有一个满足就可以了,因此 r-x------ 也会入选,范围又扩大很多
# find . -perm 111 -print //表示在当前目录下搜寻所有者、同组成员及其他成员均为可执行权限的文件及文件夹
# find . -perm -111 -print //表示在当前目录下搜寻所有者、同组成员及其他成员均含有可执行权限的文件及文件夹
#find . -perm /111 -print //表示在当前目录下搜寻所有者、同组成员及其他成员中至少一个角色含有可执行权限的文件及文件夹
+ 针对 三个权限位中的任意 一位
- 针对 三个权限位中的全部 三位
MODE 也是针对三位的
[root@localhost ~]# ls -lh test
total 0
-r--r--r-- 1 root root 0 Oct 10 20:50 test1
-rwxr--r-- 1 root root 0 Oct 10 20:50 test2
-rw-r--r-- 1 root root 0 Oct 10 20:50 test3
-rw-r--r-- 1 root root 0 Oct 10 20:50 test4
[root@localhost ~]# find test -perm 644 | xargs ls -hld
-rw-r--r-- 1 root root 0 Oct 10 20:50 test/test3
-rw-r--r-- 1 root root 0 Oct 10 20:50 test/test4
[root@localhost ~]# find test -perm +644 |xargs ls -lhd
drwxr-xr-x 2 root root 1.0K Oct 10 20:50 test //找到这个,是因为find中没有指明查找的类型,即没有-type f的原因
-r--r--r-- 1 root root 0 Oct 10 20:50 test/test1
-rwxr--r-- 1 root root 0 Oct 10 20:50 test/test2
-rw-r--r-- 1 root root 0 Oct 10 20:50 test/test3
-rw-r--r-- 1 root root 0 Oct 10 20:50 test/test4
[root@localhost ~]# find test -perm -644 | xargs ls -lhd
drwxr-xr-x 2 root root 1.0K Oct 10 20:50 test
-rwxr--r-- 1 root root 0 Oct 10 20:50 test/test2
-rw-r--r-- 1 root root 0 Oct 10 20:50 test/test3
-rw-r--r-- 1 root root 0 Oct 10 20:50 test/test4
查找文件
find ./ -type f
查找目录
find ./ -type d
查找名字为test的文件或目录
find ./ -name test
查找名字符合正则表达式的文件,注意前面的‘.*’(查找到的文件带有目录)
find ./ -regex .*so.*\.gz
查找目录并列出目录下的文件(为找到的每一个目录单独执行ls命令,没有选项-print时文件列表前一行不会显示目录名称)
find ./ -type d -print -exec ls {} \;
查找目录并列出目录下的文件(为找到的每一个目录单独执行ls命令,执行命令前需要确认)
find ./ -type d -ok ls {} \;
查找目录并列出目录下的文件(将找到的目录添加到ls命令后一次执行,参数过长时会分多次执行)
find ./ -type d -exec ls {} +
查找文件名匹配*.c的文件
find ./ -name \*.c
打印test文件名后,打印test文件的内容
find ./ -name test -print -exec cat {} \;
不打印test文件名,只打印test文件的内容
find ./ -name test -exec cat {} \;
查找文件更新日时在距现在时刻二天以内的文件
find ./ -mtime -2
查找文件更新日时在距现在时刻二天以上的文件
find ./ -mtime +2
查找文件更新日时在距现在时刻一天以上二天以内的文件
find ./ -mtime 2
查找文件更新日时在距现在时刻二分以内的文件
find ./ -mmin -2
查找文件更新日时在距现在时刻二分以上的文件
find ./ -mmin +2
查找文件更新日时在距现在时刻一分以上二分以内的文件
find ./ -mmin 2
查找文件更新时间比文件abc的内容更新时间新的文件
find ./ -newer abc
查找文件访问时间比文件abc的内容更新时间新的文件
find ./ -anewer abc
查找空文件或空目录
find ./ -empty
查找空文件并删除
find ./ -empty -type f -print -delete
查找权限为644的文件或目录(需完全符合)
find ./ -perm 664
查找用户/组权限为读写,其他用户权限为读(其他权限不限)的文件或目录
find ./ -perm -664
查找用户有写权限或者组用户有写权限的文件或目录
find ./ -perm /220
find ./ -perm /u+w,g+w
find ./ -perm /u=w,g=w
查找所有者权限有读权限的目录或文件
find ./ -perm -u=r
查找用户组权限有读权限的目录或文件
find ./ -perm -g=r
查找其它用户权限有读权限的目录或文件
find ./ -perm -o=r
查找所有者为lzj的文件或目录
find ./ -user lzj
查找组名为gname的文件或目录
find ./ -group gname
查找文件的用户ID不存在的文件
find ./ -nouser
查找文件的组ID不存在的文件
find ./ -nogroup
查找有执行权限但没有可读权限的文件
find ./ -executable \! -readable
查找文件size小于10个字节的文件或目录
find ./ -size -10c
查找文件size等于10个字节的文件或目录
find ./ -size 10c
查找文件size大于10个字节的文件或目录
find ./ -size +10c
查找文件size小于10k的文件或目录
find ./ -size -10k
查找文件size小于10M的文件或目录
find ./ -size -10M
查找文件size小于10G的文件或目录
find ./ -size -10G