小言_互联网的博客

find命令详解(含示例)

416人阅读  评论(0)

1.语法

参数为起始目录:

find(选项)(参数)  #普通用法,若不加任何参数,则将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。 

第一个参数用来指定搜索路径;
第二个参数用来指定搜索内容:

find  path -option   {[ -print ] [ -exec -ok |xargs |grep ]  [command {} \;]  #详细用法
find命令的参数:

1)path:要查找的目录路径。 

          ~ 表示$HOME目录
           . 表示当前目录
           / 表示根目录 

2)print:表示将结果输出到标准输出。 

3)exec:对匹配的文件执行该参数所给出的shell命令。 
      形式为command {} \;,注意{}与\;之间有空格 

4)ok:与exec作用相同,
      区别在于,在执行命令之前,都会给出提示,让用户确认是否执行 

5)|xargs  与exec作用相同 ,起承接作用

区别在于 |xargs 主要用于承接删除操作 ,而 -exec 都可用 如复制、移动、重命名等

6)options :选项,表示查找方式

2.常用选项

ind 根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部份为 path,之后的是 expression。如果 path 是空字串则使用目前路径,如果 expression 是空字串则使用 -print 为预设 expression。

-name ’字串’ 查找文件名匹配所给字串的所有文件,字串内可用通配符 *、?、[ ]-lname ’字串’ 查找文件名匹配所给字串的所有符号链接文件,字串内可用通配符 *、?、[ ]

expression 中可使用的选项有二三十个之多,在此只介绍最常用的部份。

-mount, -xdev : 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件
-amin n : 在过去 n 分钟内被读取过
-anewer file : 比文件 file 更晚被读取过的文件
-mtime  -n +n  :按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime  -n +n :按文件访问时间来查找文件,-n指n天以内,+n指n天以前
-ctime  -n +n :按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-cmin -n或者+n : 同上,天数换成分钟
-cnewer file :比文件 file 更新的文件
-empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name
-ipath p, -path p : 路径名称符合 p 的文件,ipath 会忽略大小写
-name name, -iname name : 文件名称符合 name 的文件。iname 会忽略大小写
-follow  如果遇到符号链接文件,就跟踪链接所指的文件
-prune   忽略某个目录
-nogroup 查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser  查无有效属主的文件,即文件的属主在/etc/passwd中不存在

-type  b/d/c/p/l/f   查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n : 文件大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。-type c : 文件类型是 c 的文件。
d: 目录
c: 字型装置文件
b: 区块装置文件
p: 具名贮列
f: 一般文件
l: 符号连结
s: socket
-pid n : process id 是 n 的文件

你可以使用 ( ) 将运算式分隔,并使用下列运算。
exp1 -and exp2
! expr
-not expr
exp1 -or exp2
exp1, exp2

3. 实例

3.1理论用法

文件


与或非逻辑,说明:当使用很多的逻辑选项时,可以用括号把这些选项括起来。为了避免Shell本身对括号引起误解,在话号前需要加转义字符“\”来去除括号的意义。例:
find \(–name ’tmp’ –xtype c -user ’inin’ \) 


#and:逻辑与,在命令中用“-a”表示,是系统缺省的选项,表示只有当所给的条 件都满足时,寻找条件才算满足 
#/home目录及子目录下查找所有以.txt和.pdf结尾的文件.
find /home \( -name "*.txt" -o -name "*.pdf" \)
或
find /home -name "*.txt" -o -name "*.pdf"

#匹配文件路径或者文件,路径名符合local的文件
find /usr/ -path "*local*"

#匹配tmp或hhh*的所有文件
#or:逻辑或,在命令中用“-o”表示。该运算符表示只要所给的条件中有一个满足 时,寻找条件就算满足。例如:
find –name ’tmp’ –o –name ’hhh*#否定not:逻辑非,在命令中用“!”表示。该运算符表示查找不满足所给条件的文件 。例如: 
#找出/home下不是以.txt结尾的文件
find /home ! -name "*.txt"

基于正则表达式匹配文件路径

find . -regex ".*\(\.txt\|\.pdf\)$"

#同上,但忽略大小写
find . -iregex ".*\(\.txt\|\.pdf\)$"

基于目录深度

#向下最大深度限制为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

#搜索超过七天内被访问过的所有文件
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

删除匹配文件

#删除/data下所有.txt文件
find /data -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选项及其他命令结合

-exec:对搜索的结构指令指定的shell命令。注意格式要正确:"-exec 命令 {} ;"
在}和\之间一定要有空格才行;
{}表示命令的参数即为所找到的文件;命令的末尾必须以“ ;”结束。

#在root以及子目录查找不包括目录/root/bin的,greek用户的,文件类型为普通文件的,3天之前的名为test-find.c的文件,并将结构输出,find命令如下:
find / -name "test-find.c" -type f -mtime +3 -user greek -prune /root/bin -print 

#对上述例子搜索出来的文件进行删除操作,命令如下:
find / -name "test-find.c" -type f -mtime +3 -user greek -prune /root/bin -exec rm {} \; 

#查找当前目录中所有以main开头的文件,并显示这些文件的内容。 
find . - name ‘main*- exec more {} \; 

#删除当前目录下所有一周之内没有被访问过的a .out或*.o文件 
find . \(- name a.out - o - name ‘*.o’\)> - atime +7 - exec rm {} \; 
#此条指令解释:
#命令中的“.”表示当前目录,此时 find 将从当前目录开始,逐个在其子目录中查找满足后面指定条件的文件。
#“\(” 和 “\)” 表示括号(),其中的 “\” 称为转义符。之所以这样写是由于对 Shell 而言,(和)另有不同的含义,而不是这里的用于组合条件的用途。
#“-name a.out” 是指要查找名为a.out的文件;
# “-name ‘*.o’” 是指要查找所有名字以 .o 结尾的文件。
#这两个 -name 之间的 -o 表示逻辑或(or),即查找名字为a.out或名字以 .o结尾的文件。
# find命令在当前目录及其子目录下找到这佯的文件之后,再进行判断,看其最后访问时间 是否在7天以前(条件 -atime +7),若是,则对该文件执行命令 rm(-exec rm {} \;)。
#其中 {} 代表当前查到的符合条件的文件名,\;则是语法所要求的。
# 上述命令中第一行的最后一个 \ 是续行符。当命令太长而在一行写不下时,可输入一个 \,之后系统将显示一个 >,指示用户继续输入命令。 

基础实例:

#找出当前目录下所有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 {} \;

替换/data目录及其子目录下所有以.txt结尾的文件内字符串

#替换/data目录及其子目录下所有以.txt结尾的文件中的包含hh的字符串为cc
sed -i "s/hh/cc/g" `find /data -type f -name "*.txt"`

搜索但跳出指定目录

#查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk
find . -path "./sk" -prune -o -name "*.txt" -print

长度为零的文件

#列出所有长度为零的文件
find . -empty

3.2 场景实例

删除大日志文件

服务器磁盘满,一般由大的日志文件导致,需找到大文件并删除。

 find / -size +500M -print0|xargs -0 du -m|sort -nr
#find指令为找出500M以上的文件,print0和xargs -0配合使用,用来解决文件名中有空格或特殊字符问题。du -m是查看这些文件的大小,并以m为单位显示。最后sort -nr是按照数字反向排序(大的文件在前)
或者
上述方法从根路径查找,可能列出一些系统文件。可以在这个查找之前先进行一下过滤。
使用du -m -d 1 /|sort -nr  先看看根路径下,哪个文件夹比较大,并且有嫌疑是导致磁盘满的罪魁祸首。然后再基于那个目录进行find。

模糊查找

 #写过一个xxx.c的文件,但是忘了放哪里了
find / -name *xxx*.c 模糊查找下这个文件

其他实例

#在root以及子目录查找不包括目录/root/bin的,greek用户的,文件类型为普通文件的,3天之前的名为test-find.c的文件,并将结构输出,find命令如下:
find / -name "test-find.c" -type f -mtime +3 -user greek -prune /root/bin -print 
#将目前目录及其子目录下所有延伸档名是 c 的文件列出来。
find . -name "*.c"
#将目前目录其其下子目录中所有一般文件列出
find . -type f
#将目前目录及其子目录下所有最近 20 天内更新过的文件列出
find . -ctime -20
#查找/var/log目录中更改时间在7日以前的普通文件,并在删除之前询问它们:
find /var/log -type f -mtime +7 -ok rm {} \;
#查找前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件:
 find . -type f -perm 644 -exec ls -l {} \;
#为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径:
find / -type f -size 0 -exec ls -l {} \;

4.完整选项及参考来源

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

参考:
https://man.linuxde.net/find

https://www.runoob.com/linux/linux-comm-find.html

http://www.chinaz.com/server/2009/0807/85796.shtml


转载:https://blog.csdn.net/qq_40993864/article/details/104640109
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场