玩linux的朋友都知道,在linux系统中查找文件,经常会用到find命令,它有众多的参数与选项,巧妙搭配可以实现非常复杂且功能强大的文件与目录查找,如果再结合xargs又可以实现找到文件后的一些操作,包括文件重命名,文件删除、修改文件权限等。
脚本学堂在之前的文章中,介绍过find命令的用法(linux命令实例之find命令 linux find命令之xargs的用法),不了解这个命令的朋友,可以先参考下。
下面开始今天的教程,先来看下find命令的基本语法。
find是linux命令,它将档案系统内符合expression的档案列出来,可以指要档案的名称、类别、时间、大小、权限等不同命令的组合,只有完全相符的才会被列出来。
find可以在当前目录下甚至整个文件系统来查找某些文件或目录;
注意:find命令是相当耗资源的不得以的时候不要find的,比如说根 / 目录;
功能说明:查找文件或目录
find-->实时查找:速度慢、精确匹配
命令语法:
find [options] [查找路径] [查找条件] [处理动作]
查找路径:默认为当前目录
查找条件:默认为查找指定路径下的所有文件
处理动作:默认为显示
一,find的用法
1、查找条件:根据文件名称查找时是严格区分字母大小写的
-name "文件名称": 支持使用globbing
* :重复0次或者任意多次前面字符
? :单个字符
[] :字符范围
[^]:排除字符范围
应用实例:
1)、查看/etc目录下有多少passwd文件:
[root@jbxue ~]#
[root@jbxue ~]# find /etc -name "passwd"
/etc/pam.d/passwd
/etc/passwd
[root@jbxue ~]#
2)、查看/etc目录下所有以passwd开头的文件:
[root@jbxue ~]# find /etc -name "passwd*"
/etc/pam.d/passwd
/etc/passwd-
/etc/passwd
[root@jbxue ~]#
3)、查看/etc目录下所有以passwd结尾的文件:
[root@jbxue ~]# find /etc -name "*passwd"
/etc/pam.d/passwd
/etc/passwd
/etc/security/opasswd
[root@jbxue ~]#
2、-iname "文件名称":查找时不区分字符大小写
应用举例:
1)、查找/etc下所有以passwd开头的文件(并不区分大小写):
[root@jbxue ~]# touch /etc/Passwd -->创建测试文件
[root@jbxue ~]# find /etc -iname "passwd*"
/etc/pam.d/passwd
/etc/passwd-
/etc/passwd
/etc/Passwd
[root@jbxue ~]# rm -rf /etc/Passwd
注意,不要再/etc目录下随便创建文件.
3、根据属主属组来查找:
-user UserName: 根据属主查找
-group GroupName: 根据属组查找
二,linux命令之find命令的应用举例
1)、查找文件的属主是Hadoop用户的文件:
[root@jbxue ~]# su - hadoop
[hadoop@jbxue ~]$ cp/etc/
fstab/tmp/-->注意以谁的身份复制文件,文件的属主属组就是谁的.
[hadoop@jbxue ~]$ ls-l /tmp/
total 28
-rw-r--r-- 1 hadoop hadoop 921 Feb 26 18:14 fstab
[hadoop@jbxue ~]$
[root@jbxue ~]# find /tmp -user hadoop
/tmp/fstab
[root@jbxue ~]#
2)、查找文件的属组是hadoop用户的文件:
[root@jbxue ~]# find /tmp -group hadoop
/tmp/fstab
[root@jbxue ~]#
4、根据UID/GID来查找:
-uid UID
-gid GID
如果将Fedora用户删除,没有加选项-r,就不会删除用户文件的;
如果文件的属主属组不在了,会发生什么问题呢?但是,如果此前不确定用户名,也可以使用uid的;
应用举例:
1)、查找/tmp目录下uid是501的所有文件:
[root@jbxue ~]# useradd fedora -->创建用户
[root@jbxue ~]# su - fedora -->切换到fedora用户
[fedora@jbxue ~]$ cp/etc/inittab/tmp/-->以fedora用户来复制文件
[fedora@jbxue ~]$ ls-l /tmp/
total 28
-rw-r--r-- 1 hadoop hadoop 921 Feb 26 18:14 fstab
-rw-r--r-- 1 fedora fedora 884 Feb 26 18:22 inittab
[fedora@jbxue ~]$ exit
logout
[root@jbxue ~]# userdel fedora -->模拟删除用户
[root@jbxue ~]# ls -l /tmp/
total 28
-rw-r--r-- 1 hadoop hadoop 921 Feb 26 18:14 fstab
-rw-r--r-- 1501501 884 Feb 26 18:22 inittab -->注意:现在属主属组属于501
[root@jbxue ~]# find /tmp -user fedroa -->这是找不到的啦!
find: `fedroa' is not the name of a known user
[root@jbxue ~]# find /tmp -uid 501 -->假设我们知道fedora的uid,就可以全局范围的查找fedora的文件了.
/tmp/inittab
[root@jbxue ~]#
5、根据-nouser、-nogroup: 查找没有属主、属组的文件;
-nouser:查找没有属主的文件,即该文件的属主在/etc/passwd中不存在。
-nogroup: 查找没有属组的文件,即该文件所属的组在/etc/group中不存在。
应用举例:
1)、假如说现在就在系统上找没有属主的文件应该怎么样找呢?
[root@jbxue ~]# find /tmp -nouser
/tmp/inittab
[root@jbxue ~]#
6.组合条件:
-a: 与,同时满足(可以不写的)
-o: 或,表示一个满足就可以
-not, !:非,取反
应用举例:
1)、查找/tmp目录下没有属主或属主为hadoop的文件:
[root@jbxue ~]# find /tmp -nouser -o -user hadoop
/tmp/inittab
/tmp/fstab
[root@jbxue ~]#
2)、查找/tmp目录下属主为hadoop,并且文件以.txt结尾的文件:
[hadoop@jbxue ~]$ whoami
hadoop -->当前用户
[hadoop@jbxue ~]$ cd /tmp/
[hadoop@jbxue tmp]$ touch word.doc hello.txt
[hadoop@jbxue tmp]$ ll -->新建文件以便测试.
total 28
-rw-r--r-- 1hadoop hadoop 921Feb 2618:14fstab
-rw-rw-r-- 1hadoop hadoop0Feb 2618:58hello.txt
-rw-r--r-- 1501501884Feb 2618:22inittab
-rw-rw-r-- 1hadoop hadoop0Feb 2618:58word.doc
root用户
[root@jbxue ~]# find /tmp -user hadoop -name "*.txt"
/tmp/hello.txt
[root@jbxue ~]#
3)、查找/tmp目录下属主为hadoop,并且也不是以.txt结尾的文件:
[root@jbxue ~]# find /tmp -user hadoop -a -not -name "*.txt"
/tmp/fstab
/tmp/word.doc
[root@jbxue ~]#
4)、查找/tmp目录下属主不是hadoop,并且也不是以.txt结尾的文件
I.使用的是-a选项:
[root@jbxue tmp]# find /tmp -not -user hadoop -a -not -name "*.txt"
/tmp
/tmp/inittab
/tmp/.ICE-unix
[root@jbxue tmp]#
II.使用的是-o选项:
[root@jbxue tmp]#
[root@jbxue tmp]# find /tmp -not ( -user hadoop -o -name "*.txt" )
/tmp
/tmp/inittab
/tmp/.ICE-unix
[root@jbxue tmp]#
5)、查找/tmp目录下属主不是hadoop,或者不是以.txt结尾的:
[root@jbxue tmp]# find /tmp -not -user hadoop -o -not -name "*.txt"
/tmp
/tmp/inittab
/tmp/fstab
/tmp/word.doc
/tmp/.ICE-unix
[root@jbxue tmp]#
6.根据文件类型查找:
-type: 根据文件类型查找
f: 普通文件
d: 目录
b: 块设备
c: 字符设备
l: 符号链接文件
p: 命名管道
s: 套接字
应用举例:
1)、将/tmp目录下的目录显示出来:
[root@jbxue tmp]# find /tmp -type d
/tmp
/tmp/.ICE-unix
[root@jbxue tmp]#
2)、查找/tmp目录下的普通文件显示出来:
[root@jbxue tmp]# find /tmp -type f
/tmp/inittab
/tmp/fstab
/tmp/word.doc
/tmp/hello.txt
[root@jbxue tmp]#