Linux命令-find命令

find命令

find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

语法

find (选项) (参数)

选项

  • 常用参数
  • -name<范本样式>:指定字符串作为寻找文件或目录的范本样式;
  • -iname<范本样式>:此参数的效果和指定“-name”参数类似,但忽略字符大小写的差别;
  • -type<文件类型>:只寻找符合指定的文件类型的文件;
  • -size<文件大小>:查找符合指定的文件大小的文件;
  • -perm<权限数值>:查找符合指定的权限数值的文件或目录;
  • -fstype<文件系统类型>:只寻找该文件系统类型下的文件或目录;
  • -mtime<24小时数>:查找在指定时间曾被更改过的文件或目录,单位以24小时计算;
  • -mmin<分钟>:查找在指定时间曾被更改过的文件或目录,单位以分钟计算;
  • -amin<分钟>:查找在指定时间曾被存取过的文件或目录,单位以分钟计算;
  • -atime<24小时数>:查找在指定时间曾被存取过的文件或目录,单位以24小时计算;
  • -ctime<24小时数>:查找在指定时间之时被更改的文件或目录,单位以24小时计算;
  • -cmin<分钟>:查找在指定时间之时被更改过的文件或目录;
  • -print:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为每列一个名称,每个名称前皆有“./”字符串;
  • -fprint<列表文件>:此参数的效果和指定“-print”参数类似,但会把结果保存成指定的列表文件;
  • -printf<输出格式>:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式可以自行指定;
  • -fprintf<列表文件><输出格式>:此参数的效果和指定“-printf”参数类似,但会把结果保存成指定的列表文件;
  • -exec<执行指令>:假设find指令的回传值为True,就执行该指令;
  • -ok<执行指令>:此参数的效果和指定“-exec”类似,但在执行指令之前会先询问用户,若回答“y”或“Y”,则放弃执行命令;
  • 其他参数
  • -anewer<参考文件或目录>:查找其存取时间较指定文件或目录的存取时间更接近现在的文件或目录;
  • -cnewer<参考文件或目录>查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
  • -daystart:从本日开始计算时间;
  • -depth:从指定目录下最深层的子目录开始查找;
  • -expty:寻找文件大小为0 Byte的文件,或目录下没有任何子目录或文件的空目录;
  • -false:将find指令的回传值皆设为False;
  • -fls<列表文件>:此参数的效果和指定“-ls”参数类似,但会把结果保存为指定的列表文件;
  • -follow:排除符号连接;
  • -fprint0<列表文件>:此参数的效果和指定“-print0”参数类似,但会把结果保存成指定的列表文件;
  • -gid<群组识别码>:查找符合指定之群组识别码的文件或目录;
  • -group<群组名称>:查找符合指定之群组名称的文件或目录;
  • -help或——help:在线帮助;
  • -ilname<范本样式>:此参数的效果和指定“-lname”参数类似,但忽略字符大小写的差别;
  • -inum:查找符合指定的inode编号的文件或目录;
  • -ipath<范本样式>:此参数的效果和指定“-path”参数类似,但忽略字符大小写的差别;
  • -iregex<范本样式>:此参数的效果和指定“-regexe”参数类似,但忽略字符大小写的差别;
  • -links<连接数目>:查找符合指定的硬连接数目的文件或目录;
  • -iname<范本样式>:指定字符串作为寻找符号连接的范本样式;
  • -ls:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出;
  • -maxdepth<目录层级>:设置最大目录层级;
  • -mindepth<目录层级>:设置最小目录层级;
  • -mount:此参数的效果和指定“-xdev”相同;
  • -newer<参考文件或目录>:查找其更改时间较指定文件或目录的更改时间更接近现在的文件或目录;
  • -nogroup:找出不属于本地主机群组识别码的文件或目录;
  • -noleaf:不去考虑目录至少需拥有两个硬连接存在;
  • -nouser:找出不属于本地主机用户识别码的文件或目录;
  • -path<范本样式>:指定字符串作为寻找目录的范本样式;
  • -print0:假设find指令的回传值为Ture,就将文件或目录名称列出到标准输出。格式为全部的名称皆在同一行;
  • -prune:不寻找字符串作为寻找文件或目录的范本样式;
  • -regex<范本样式>:指定字符串作为寻找文件或目录的范本样式;
  • -true:将find指令的回传值皆设为True;
  • -uid<用户识别码>:查找符合指定的用户识别码的文件或目录;
  • -used<日数>:查找文件或目录被更改之后在指定时间曾被存取过的文件或目录,单位以日计算;
  • -user<拥有者名称>:查找符和指定的拥有者名称的文件或目录;
  • -version或——version:显示版本信息;
  • -xdev:将范围局限在先行的文件系统中;
  • -xtype<文件类型>:此参数的效果和指定“-type”参数类似,差别在于它针对符号连接检查。

案例

  • 案例1
    列出当前目录及子目录下所有文件和文件夹
find .
  • 案例2
    在/home目录下查找以.txt结尾的文件名
find /home -name "*.txt"
  • 案例3
    同上,但忽略大小写
find /home -iname "*.txt"
  • 案例4:
    当前目录及子目录下查找所有以.txt和.pdf结尾的文件
find . \( -name "*.txt" -o -name "*.pdf" \)

或

find . -name "*.txt" -o -name "*.pdf" 
  • 案例5
    匹配文件路径或者文件
find /usr/ -path "*local*"
  • 案例6
    基于正则表达式匹配文件路径
find . -regex ".*\(\.txt\|\.pdf\)$"
  • 案例7
    同上,但忽略大小写
find . -iregex ".*\(\.txt\|\.pdf\)$"

否定参数

找出/home下不是以.txt结尾的文件

find /home ! -name "*.txt"

根据文件类型进行搜索

find . -type 类型参数

类型参数列表:

  • f 普通文件
  • l 符号连接
  • d 目录
  • c 字符设备
  • b 块设备
  • s 套接字
  • p Fifo

基于目录深度搜索

向下最大深度限制为3

find . -maxdepth 3 -type f

搜索出深度距离当前目录至少2个子目录的所有文件

find . -mindepth 2 -type f

根据文件时间戳进行搜索

find . -type f 时间戳

UNIX/Linux文件系统每个文件都有三种时间戳:

  • 访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。
  • 修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。
  • 变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
    搜索最近七天内被访问过的所有文件
find . -type f -atime -7

搜索恰好在七天前被访问过的所有文件

find . -type f -atime 7

搜索访问时间超过10分钟的所有文件

find . -type f -amin +10

找出比file.log修改时间更长的所有文件

find . -type f -newer file.log

根据文件大小进行匹配

find . -type f -size 文件大小单元

文件大小单元:

  • b —— 块(512字节)
  • c —— 字节
  • w —— 字(2字节)
  • k —— 千字节
  • M —— 兆字节
  • G —— 吉字节
    搜索大于10KB的文件
find . -type f -size +10k

搜索小于10KB的文件

find . -type f -size -10k

搜索等于10KB的文件

find . -type f -size 10k

删除匹配文件

删除当前目录下所有.txt文件

find . -type f -name "*.txt" -delete

根据文件权限/所有权进行匹配

当前目录下搜索出权限为777的文件

find . -type f -perm 777

找出当前目录下权限不是644的php文件

find . -type f -name "*.php" ! -perm 644

找出当前目录用户tom拥有的所有文件

find . -type f -user tom

找出当前目录用户组sunk拥有的所有文件

find . -type f -group sunk

借助-exec选项与其他命令结合使用

找出当前目录下所有root的文件,并把所有权更改为用户tom

find .-type f -user root -exec chown tom {} \;

上例中,{} 用于与-exec选项结合使用来匹配所有文件,然后会被替换为相应的文件名。
找出自己家目录下所有的.txt文件并删除

find $HOME/. -name "*.txt" -ok rm {} \;

上例中,-ok和-exec行为一样,不过它会给出提示,是否执行相应的操作。
查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中

find . -type f -name "*.txt" -exec cat {} \;> all.txt

将30天前的.log文件移动到old目录中

find . -type f -mtime +30 -name "*.log" -exec cp {} old \;

找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来

find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;

因为单行命令中-exec参数中无法使用多个命令,以下方法可以实现在-exec之后接受多条命令

-exec ./text.sh {} \;

搜索但跳出指定的目录

查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk

find . -path "./sk" -prune -o -name "*.txt" -print

find其他技巧收集

要列出所有长度为零的文件

find . -empty

练习题

  1. 查找/var目录属主为root,且属组为mail的所有文件
  2. 查找/usr目录下不属于root、bin或hadoop的所有文件
  3. 查找/etc目录下最近一周内其内容修改过,且属主不为root或hadoop的所有文件
  4. 查找当前系统上没有属主或属组,且最近一周内曾被访问过的所有文件
  5. 查找/etc目录下大于20K且类型为普通文件的所有文件
  6. 查找/etc目录下所有用户都没有写权限
  7. 查找/etc目录下至少有一类用户没有执行权限的文件
  8. 查找/etc/init.d目录下,所有用户都有执行权限,且其它用户拥有写权限的文件
find /var -user root -group mail -ls
find /var \( -user root -a -group mail \) -ls

find /usr ! \( -user root -o -user bin -o -user jason \) -exec ls -l {} \;

find /etc ! \( -user root -o -user hadoop \) -mtime -7 -exec ls -l {} \;

find / -atime -7 -a \( -nouser -o -nogroup \) -ls

find /etc -type f -size +20k -exec ls -l {} \; |head -n 10

find /etc ! -perm /222 -exec ls -l  {} \;

find /etc ! -perm -111 -exec ls -l {} \;

find /etc/init.d -perm -112 -exec ls -l {} \;

练习题

1.查找 /tmp 目录下名字为 aming开头的所有文件。
find /tmp -name "aming*"    #注意这里并不能使用 ^aming

2.查找指定 inode 的文件或目录
find / -inum 141418

3.找出 tmp 目录下的所有一级子目录
find /tmp -maxdepth 1 -type d  
在root目录下及其最大两层深度的子目录中,查找 passwd 文件
find /root -maxdepth 3 -name passwd  
在第二层和第四层子目录之间查找 passwd 文件
find . -mindepth 3 -maxdepth 5 -name passwd

4.搜索tmp目录下所属组group1,所属主user1的文件
find /tmp -type f -user user1 -group group1

5.搜索根目录下的 1.txt 2.txt 和 a 目录  
find / -name 1.txt -o -name 2.txt -o -type d -name a

6. 搜索tmp目录下以 a 开头并且以 c 结尾的文件   
find /tmp -name "a*" -a -name "*c" -type f

7. 搜索 tmp 目录下,不是以 a 开头,并且大小超过100M的文件  
find /tmp -not -name "a*" -a -name "*txt" -size +100M -tyep f

8. 搜索 tmp 目录下,修改时间一年内的文件   
find . -type f  -mtime -365

9. 搜索目录下,修改时间一年内,不是文件的其他类型   
find . -not -type f -mtime -365

10.搜索目录下,修改时间超过一年的并且大于100M的文件   
find . -type f -not -mtime -365 -a -size +100M

11.列出tmp目录下一年内都没有改变的文件   
find /tmp -type f ! -mtime -365

12.找出 tmp 目录下的所有的一级空目录
find . -type d -empty
13.搜索tmp目录下名称包含*.txt的目录,或者包含*.txt并且权限为777的文件或目录
find /tmp -name *.txt -a /( -perm 777 -o -type d /)  #-a and意思

14.查找所有的隐藏目录
find . -type d -name ".*"

15.搜索当前目录下10天以前的文件,或者权限为644的的文件和目录
find . -type f -mtime +10 -o -perm 644

16.在 / 目录下的 etc目录及其子目录下查找 passwd 文件
find /etc -name passwdfind / -path -path "/etc*" -name passwd/etc/passwd/etc/pam.d/passwd 在根目录下的 etc 以及 tmp 目录内查找 passwd 文件cp /etc/passwd /tmpfind / /( -path "/etc*" -o -path "/tmp*" /) -name passwd
在所有名为 general 的目录下查找 .stp 结尾的文件find / -path "*/general/*" -name "*.stp"
 找到 usr 目录下,并且在 applications 子目录里面以 .cache 结尾的文件。假设并不知道 applications 的绝对路径,并且目录是第 10 层甚至第 100 层目录,只知道绝对路径以 /usr/local 开头方法一:find /usr/local -name applications -type d 在用上面找到的绝对路径去执行 find ....... -name "*.cache"方法二: find /usr/local -path "*share*" -name "*.cache" 
NOTE: -path ".." ,表示 path 路径里面包含指定的字符。

17.查找除 /etc 目录及其子目录下的,仍在根目录的 passwd 文件
find / -path "/etc" -prune -o -name passwd -print
查找/tmp/ 目录下所有文件(不包含目录), 并且不包含目录123
find /tmp/ -path "/tmp/123" -prune -o -type f -print-print -path -prune -o 固定格式,一个都不能少 ,表示排除指定的目录或文件
查找/tmp/ 目录下所有文件(不包含目录), 并且不包含目录123和目录234和目录345find /tmp/ /( -path "/tmp/123" -o -path "/tmp/234" -o -path "/tmp/345" /) -prune -o -type f -print注意,如果是查找目录时,-path 后面的目录名一定不要带/ 如 写成 -path "/tmp/123/" 就错了,而查找文件时,带/ 没有问题。

18.删除tmp目录下所有文件
find /tmp/ -type f |xargs rm

19.查找类型为 ext4 的文件
find . -fstype ext4

20.查找tmp目录下包含abcde字母的文件,不区分大小
find /tmp -iname abcde
使用find重命名文件

21.用inode 16187430 编号重命名为 newtest
find -inum 16187430 -exec mv {} new-test-file-name /;

22.给tmp目录下的所有文件增加.bak后缀
find /tmp/ -type f |xargs -i {} {}.bak-i 
#把签名列出的文件一个个的处理{} 表示一次一个对象,比如find出来很多行,每次处理一行,用{}代表这一行

23.找到具有组读权限的文件和目录
find . -perm -g=r  -exec ls -l {} /; 
#-g=r 会模糊匹配,只要含有 r 权限的都会列出来

24.找到具有组读权限和写权限的文件和目录
find . -perm -g=r -a -perm -g=w -type f 

25.搜索具有用户读写可执行权限的目录
find . -perm -u=r -a -perm -u=w -a -perm -u=x -type f

26.找到对组用户具有只读权限的文件,
find -perm g=r -exec ls -l {} /;
#----r----- 1 root root 0 3月  31 21:50 ./1find -perm 040 -exec ls -l {} /;

27.列出/etc目录及其子目录下的5个最大的文件。
find /etc  -exec ls -s {} /; | sort -n -r | head -5

28.列出 /etc 目录及其子目录下5个最小的文件
find /etc -type f -exec ls -s {} /; | sort -n  | head -5

29.列出 /etc 目录及其子目录下5个最小的文件,不包含 0 空文件
find /etc -not -empty -type f -exec ls -s {} /; | sort -n  | head -5find /etc ! -empty 
-type f -exec ls -s {} /; | sort -n  | head -5

30.find 命令删除大于100M的 .zip 文件
find / -type f -name "*.zip" -size +100M -exec rm -i {} /;

31.列出在1.txt修改之后修改的文件
find -newer 1.txt

32.列出在1.txt 和 test 之间修改的文件
find -newer 1.txt ! -newer test       #该命令列出的文件,会包含 test 文件

33.列出在 2012.12.01 到 2012.12.31 修改的文件思路,手动创建两个文件,文件目录无所谓,修改时间
#touch -m -t 1212010000 1.txt
#touch -m -t 1212322359 2.txt
find / -newer 1.txt ! -newer 2.txt

你可能感兴趣的:(Linux命令-find命令)