find命令是Linux下最常用的命令之一,灵活的使用find命令,你会发现查找文件变得十分简单。
命令格式
find [指定查找目录] [查找规则(选项)] [查找完后执行的动作]
参数规则
-name 按照文件名查找文件
-iname 根据文件名查找,但是不区分大小写
-perm 按照文件权限来查找文件
-prune 使用这一选项可以使find命令不在当前指定的目录中查找
-user 根据属主来查找文件
-group 根据属组来查找文件
-uid 根据uid来查找文件
-gid 根据gid来查找文件
关联条件的使用
-a 连接两个不同的条件(两个条件必须同时满足)
-o 连接两个不同的条件(两个条件满足其一即可)
-not 对条件取反的
根据文件时间戳的相关属性来查找文件
-mmin n 文件最后一次修改是在n分钟之内
-mtime n 文件最后一次修改是在 n*24小时之内
find /tmp –atime +5 表示查找在五天内没有访问过的文件
-amin n 文件最后一次访问是在n分钟之内
-atime n 文件最后一次访问是在 n*24小时之内
-cmin n 文件的状态在n分钟内被改变
-ctime n 文件状态在n*24小时内(也就是n天内)被改变
-type 根据文件类型来查找文件
f // 普通文件 d //目录文件 l //链接文件 b //块设备文件 c //字符设备文件 p //管道文件 s //socket文件
-size 根据大小来查找文件
-perm 根据文件权限查找文件
-newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件
查找完执行
-print 默认情况下的动作
-ls 查找到后用ls 显示出来
-ok [commend] 查找后执行命令的时候询问用户是否要执行
-exec [commend] 查找后执行命令的时候不询问用户,直接执行
-nouser and -nogroup 在整个系统中查找既没有属主又没有属组的文件(这样的文件通常是很危险的,应该及时清除)
相关命令
locate命令,locate命令其实是“find -name”的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
whereis命令,在特定目录中查找符合条件的文件。和find相比,whereis查找的速度非常快,这是因为linux系统会将 系统内的所有文件都记录在一个数据库文件中,当使用whereis和下面即将介绍的locate时,会从数据库中查找数据,而不是像find命令那样,通过遍历硬盘来查找,效率自然会很高。但是该数据库文件并不是实时更新,默认情况下时一星期更新一次,因此,我们在用whereis和locate 查找文件时,有时会找到已经被删除的数据,或者刚刚建立文件,却无法查找到,原因就是因为数据库文件没有被更新。
which命令,which是通过 PATH环境变量到该路径内查找可执行文件,基本功能是寻找可执行文件。
type命令,它是用来区分某个命令到底是由shell自带的,还是由shell外部的独立二进制文件提供的。如果一个命令是外部命令,那么使用-p参数,会显示该命令的路径,相当于which命令。
场景范例
1. 用文件名查找文件
这是find命令的一个基本用法。
# find -name "nginx.conf"
2.用文件名查找文件,忽略大小写
# find -iname "nginx.conf"
3. 使用mindepth和maxdepth限定搜索指定目录的深度
在root目录及其子目录下查找passwd文件。
# find / -name passwd
在root目录及其1层深的子目录中查找passwd. (例如root — level 1, and one sub-directory — level 2)
# find -maxdepth 2 -name passwd
在root目录下及其最大两层深度的子目录中查找passwd文件. (例如 root — level 1, and two sub-directories — level 2 and 3 )
# find / -maxdepth 3 -name passwd
在第二层子目录和第四层子目录之间查找passwd文件。
# find -mindepth 3 -maxdepth 5 -name passwd
4. 查找后指令,在find命令查找到的文件上执行命令
下面的例子展示了find命令来计算所有不区分大小写的文件名为“MyCProgram.c”的文件的MD5验证和。{}将会被当前文件名取代。
find -iname "MyCProgram.c" -exec md5sum {} \;
5.相反匹配
显示所有的名字不是MyCProgram.c的文件或者目录。由于maxdepth是1,所以只会显示当前目录下的文件和目录。
find -maxdepth 1 -not -iname "MyCProgram.c"
6. 使用inode编号查找文件
任何一个文件都有一个独一无二的inode编号,借此我们可以区分文件。创建两个名字相似的文件,例如一个有空格结尾,一个没有。
从ls的输出不能区分哪个文件有空格结尾。使用选项-i,可以看到文件的inode编号,借此可以区分这两个文件。
你可以如下面所示在find命令中指定inode编号。在此,find命令用inode编号重命名了一个文件。
find -inum 16187430 -exec mv {} new-test-file-name \;
7. 根据文件权限查找文件
下面的操作时合理的:
找到具有指定权限的文件
忽略其他权限位,检查是否和指定权限匹配
根据给定的八进制/符号表达的权限搜索
此例中,假设目录包含以下文件。注意这些文件的权限不同。
ls -l
total 0
-rwxrwxrwx 1 root root 0 2009-02-19 20:31 all_for_all
-rw-r--r-- 1 root root 0 2009-02-19 20:30 everybody_read
---------- 1 root root 0 2009-02-19 20:31 no_for_all
-rw------- 1 root root 0 2009-02-19 20:29 ordinary_file
-rw-r----- 1 root root 0 2009-02-19 20:27 others_can_also_read
----r----- 1 root root 0 2009-02-19 20:27 others_can_only_read
找到具有组读权限的文件。使用下面的命令来找到当前目录下对同组用户具有读权限的文件,忽略该文件的其他权限。
find . -perm -g=r -type f -exec ls -l {} \;
-rw-r--r-- 1 root root 0 2009-02-19 20:30 ./everybody_read
-rwxrwxrwx 1 root root 0 2009-02-19 20:31 ./all_for_all
----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read
-rw-r----- 1 root root 0 2009-02-19 20:27 ./others_can_also_read
找到对组用户具有只读权限的文件。
find . -perm g=r -type f -exec ls -l {} \;
----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read
找到对组用户具有只读权限的文件(使用八进制权限形式)。
find . -perm 040 -type f -exec ls -l {} \;
----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read
8. 找到home目录及子目录下所有的空文件(0字节文件)
下面命令的输出文件绝大多数都是锁定文件盒其他程序创建的place hoders
find ~ -empty
只列出你home目录里的空文件。
find . -maxdepth 1 -empty
只列出当年目录下的非隐藏空文件。
find . -maxdepth 1 -empty -not -name ".*"
9. 查找5个最大的文件
下面的命令列出当前目录及子目录下的5个最大的文件。这会需要一点时间,取决于命令需要处理的文件数量。
find . -type f -exec ls -s {} \; | sort -n -r | head -5
10. 查找5个最小的文件
方法同查找5个最大的文件类似,区别只是sort的顺序是降序。
find . -type f -exec ls -s {} \; | sort -n | head -5
上面的命令中,很可能你看到的只是空文件(0字节文件)。如此,你可以使用下面的命令列出最小的文件,而不是0字节文件。
find . -not -empty -type f -exec ls -s {} \; | sort -n | head -5
11. 使用-type查找指定文件类型的文件
只查找socket文件
find . -type s
查找所有的目录
find . -type d
查找所有的一般文件
find . -type f
查找所有的隐藏文件
find . -type f -name ".*"
查找所有的隐藏目录
find -type d -name ".*"
12. 通过和其他文件比较修改时间查找文件
显示在指定文件之后做出修改的文件。下面的find命令将显示所有的在ordinary_file之后创建修改的文件。
# find -newer ordinary_file
13. 通过文件大小查找文件
使用-size选项可以通过文件大小查找文件。
查找比指定文件大的文件
find ~ -size +100M
查找比指定文件小的文件
find ~ -size -100M
查找符合给定大小的文件
find ~ -size 100M
注意: – 指比给定尺寸小,+ 指比给定尺寸大。没有符号代表和给定尺寸完全一样大。
14. 给常用find操作取别名
若你发现有些东西很有用,你可以给他取别名。并且在任何你希望的地方执行。
常用的删除a.out文件。
alias rmao="find . -iname a.out -exec rm {} \;"
# rmao
删除c程序产生的core文件。
alias rmc="find . -iname core -exec rm {} \;"
# rmc
15. 用find命令删除大型打包文件
下面的命令删除大于100M的*.zip文件。
find / -type f -name *.zip -size +100M -exec rm -i {} \;"
16.找到在1个小时内被更改的文件
find -mmin -60
或者
find -mtime -1
17.找到1个小时内被访问过的文件
# find . -amin -60
18.查找一个小时内状态被改变的文件
# find . -cmin -60
19.搜索仅仅限定于文件,不显示文件夹
# find / -name "*.log"
# find / -xdev -name "*.log"
20.仅仅查找非隐藏的文件(不显示隐藏文件)
如果我们查找的时候不想隐藏文件也显示出来,可以使用下面的正则式查找:
下面的命令会显示当前目录及其子目录下15分钟内文件内容被修改过的文件,并且只列出非隐藏文件。也就是说,以.开头的文件时不会显示出来的
# find / -xdev -name "*.log"
21.查找文件修改时间在某一文件修改后的文件
# find -newer /etc/passwd
22.仅仅在当前文件系统中搜索
下面这个命令会搜索根目录/及其子目录下所有.log结尾的文件名。如果你有多个分区在/下面,那么这个搜索会去搜索所有的被挂载的分区:
# find / -name "*.log"
如果我们使用-xdev选项,那么仅仅会在在当前文件系统中搜索,下面是在xdev的man page上面找到的一段-xdev的定义:
-xdev Don’t descend directories on other filesystems.
下面的命令会在/目录及其子目录下搜索当前文件系统(也就是/挂载的文件系统)中所有以.log结尾的文件,也就是说如果你有多个分区挂载在/下面,下面的搜索不会去搜索其他的分区的(比如/home/)
# find / -xdev -name "*.log"