关于find命令的一些知识

  在服务器运维的过程中,我们会用到这样一个命令,关于这个命令,你知道多少呢?接下来,咱们一起来研究一下它的用途。

  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. 需要搜索的关键字

关键字可以使用正则表达式来模糊匹配该文件名,记住要用""将文件名模式引起来,不用双引号的话,需要\转义
find . -name \*.txt
 

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 $HOME -print
$ find ~ -print
 
$ find . -name "*.log";从当前目录中查找扩展名为.log的文件。需要说明的是,缺省情况下,find会从指定的目录搜索,并递归的搜索其子目录
  ./install.log
 
$find . -name "*.log"
$find . -name \*.log;在当前目录查找 以.log结尾的文件。 ". "代表当前目录,这两个命令执行结果一样
说明:
 
 
 
 
$find . -name "*";查找当前目录下的所有文件
$find . -name "*qmf*";查找当前目录下文件名中包含qmf的文件
$find ./ -name "[A-Z]*";想要当前目录及子目录中查找文件名以一个大写字母开头的文件
$find /etc -name "host*";想要在/etc目录中查找文件名以host开头的文件
$find ~ -name "*";想要查找$HOME目录中的文件
$find . -name "[a-z][a-z][0--9][0--9].txt";如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是.txt的文件,返回名为ax37.txt的文件
 
$find /etc -name inittab -o -size +2048000       --在etc目录下查找名称为inittab或者文件到校大于1000MB的文件
$find /etc -size +163840 -a -size -204800        --在etc目录下查找大于80MB小于100MB的文件
$find /etc -name inittab -exec ls -l {} \;       --在etc目录下查找inittab文件并显示其详细信息
$find /etc -name init* -a -type f -exec ls -l {} \;   --在etc目录下查找以init开头的、文件类型为二进制文件,查找到以后并查看详细信息;

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
-perm :按照文件权限来查找文件。(用的很常见)
按照文件权限模式用-perm选项,按文件权限模式来查找文件的话。最好使用八进制数字权限表示法,但是也可以用符号表示
$find . -type f -perm a=rwx -exec ls -l {} \;
或者
$find . -type f -perm 777 -exec ls -l {} \;   //两个效果一样
$find . -type f -perm -ug=rw -exec ls -l {} \;  //查找可以由“other”和组写入的文件
或者
$find . -type f -perm 220 -exec ls -l {} \;
$find . -perm 755;在当前目录下查找文件权限为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件
$find /opt/soft/test/ -perm 777;查找/opt/soft/test/目录下 权限为 777的文件
 
/:只匹配一位权限即可
-:文件权限全包含时才显示

find -perm,根据文件的权限来查找文件,有三种形式,是位"与", + /是位"或"

find -perm mode

find -perm -mode

find -perm /mode(+符号的作用与 / 符号相同,但是现在新版 GNU findutils 中不支持使用该符号)

三者区别:

在linux中文件或目录有三者权限r,w,x,代表的含义分别是读、写、可执行。而一个文件或目录的属性中又包括所属用户u、所属组g、其他o三个部分的属性,分别表示所属用户、所属组、其他用户对这个文件所拥有的权限。 
 所属用户   所属组    其他
   rwx       rwx      rwx
 -perm mode  :查找的档案属性『刚好等于』 mode的档案 
 -perm -mode :查找的档案属性『必须要全部囊括 mode 的属性』的档案,举例来说, 
                 我们要查找 -rwxr--r-- ,亦即744 的档案,使用 -perm -744, 
                 当一个档案的属性为 -rwxr-xr-x ,亦即 755时,也会被列出来, 
                 因为 -rwxr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。 
                 所以:-mode其实就是查找比mode值大的档案
 -perm +mode :查找档案属性『包含任一 mode 的属性』的档案,举例来说,我们查找
                 -rwxr-xr-x ,亦即 -perm +755 时,但一个档案属性为 -rw------- 
                 也会被列出來,因為他有 -rw.... 的属性存在 
[root@test test1]# ll
总用量 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 有一个可写就匹配
find -perm -222     u g o 全都可写才匹配
find . -perm 777 查找当前及子目录下所有权限为777的文件

-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

 
 
标签
上一篇:Android 基于Netty的消息推送方案之概念和工作原理(二)


下一篇:Dockerfile 时区设置