1. 文件查找:在文件系统上查找符合条件的文件

命令 解释
which 查看可执行文件的位置,只能寻找执行文件,并在PATH变量里面寻找
whereis 查看文件的位置;只能查二进制文件,说明文档,源文件等
locate 配合数据库查看文件位置;能查所有,但跟whereis一样都是查询数据库里面的内容(/var/lib/locatedb),速度快,但是有延时,极耗资源
find 实际搜索硬盘查询文件名称;最强大,但是检索硬盘,比较慢

1.1 find

find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件。

find的使用格式如下:

$ find <指定目录> <指定条件> <指定动作>
# <指定目录>: 所要搜索的目录及其所有子目录。默认为当前目录。
# <指定条件>: 所要搜索的文件的特征。
# <指定动作>: 对搜索结果进行特定的处理。

如果什么参数也不加,find默认搜索当前目录及其子目录,并且不过滤任何结果(也就是返回所有文件),将它们全都显示在屏幕上。

find的使用实例:

$ find . -name 'my*'

搜索当前目录(含子目录,以下同)中,所有文件名以my开头的文件。

$ find . -name 'my*' -ls

搜索当前目录中,所有文件名以my开头的文件,并显示它们的详细信息。

$ find . -type f -mmin -10

搜索当前目录中,所有过去10分钟中更新过的普通文件。如果不加-type f参数,则搜索普通文件+特殊文件+目录。

1.2 locate

依赖于事先构建好的索引库

locate命令其实是"find -name"的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。

1.2.1 索引库的更新有两种方式
  • 系统自动实现(周期性任务)

  • 手动更新数据库(命令:updatedb)

1.2.2 工作特性
  • 查找速度快(基于数据库实现)

  • 模糊查找

  • 非实时查找

1.2.3 命令使用格式
locate [OPTION]... PATTERN...

选项:

  • -b:只匹配路径中的基名,而非整个路径名,例:locate -b nginx

  • -c:统计出共有多少个符合条件的文件,例:locate -c nginx;locate -b -c nginx

  • -r:基于基本正则表达式来编写模式

注意:索引构建过程需要遍历整个根文件系统,极消耗资源

locate命令的使用实例:

# 搜索etc目录下所有以sh开头的文件。
$ locate /etc/sh # 搜索用户主目录下,所有以m开头的文件。
$ locate ~/m # 搜索用户主目录下,所有以m开头的文件,并且忽略大小写。
$ locate -i ~/m

1.3 whereis

whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。

whereis命令的使用实例:

[root@centos ~]#whereis grep
grep: /usr/bin/grep /usr/share/man/man1/grep.1.gz /usr/share/info/grep.info.gz
[root@centos ~]#

1.4 which

which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。

which命令的使用实例:

[root@centos ~]#which grep
alias grep='grep --color=auto'
/usr/bin/grep
[root@centos ~]#

1.5 type

type命令其实不能算查找命令,它是用来区分某个命令到底是由shell自带的,还是由shell外部的独立二进制文件提供的。如果一个命令是外部命令,那么使用-p参数,会显示该命令的路径,相当于which命令

type命令的使用实例:

# 系统会提示,cd是shell的自带命令(build-in)
[root@centos ~]#type cd
cd is a shell builtin
[root@centos ~]# # 系统会提示,grep是一个外部命令,并显示该命令的路径。
[root@centos ~]#type grep
grep is aliased to `grep --color=auto'
[root@centos ~]# # 加上-p参数后,就相当于which命令
$ type -p grep

2. find:实时查找工具

通过遍历指定起始路径下文件系统层级结构完成文件查找

2.1 工作特点:

  • 查找速度略慢

  • 精确查找(find /etc -name "passwd")

  • 实时查找

2.2 用法

find [OPTIONS] [查找起始路径] [查找条件] [处理动作]

# 查找起始路径:指定具体搜索目标起始路径,默认为当前目录

# 查找条件:指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等标准进行,默认为找出指定路径下的所有文件

# 处理动作:对符合查找条件的文件作出的操作,例如删除等操作,默认为输出至标准输出

注:查找条件或者查找标准,也称为表达式,由选项和测试组成,而测试的结果通常为布尔型("true","false")

2.3 根据文件名查找

-name "pattern"	    # pattern支持glob风格的通配符(* ? [] [^])
-iname "pattern" # pattern支持glob风格的通配符(* ? [] [^])
# 查找所有的passwd文件(区分大小写)
find /etc/ -name "passwd"
# 查找所有的passwd文件(不区分大小写)
find /etc/ -iname "passwd"
# 查找以passwd开头
find /etc/ -iname "passwd*"
# 查找以passwd结尾
find /etc/ -iname "*passwd"
# 查找以passwd结尾只能是字母的文件
find /etc/ -iname "passwd[[:alnum:]]"
# -regex pattern:基于正则表达式模式查找文件,匹配是整个路径,而非其名

示例

# 查找test目录下所有以.c结尾的文件,注意"*.c"中的双引号
$ find ./test/ -name "*.c"
./test/test_c/c.c
./test/test_b/b.c
./test/test_a/a.c
$ find ./test/ -name "*.c" -exec cat {} \;
ccccc
bbbbb
aaaa
$ find ./test -name "*.c"|xargs -I {} cat {}
ccccc
bbbbb
aaaa

2.4 根据文件的从属关系查找

# 查找属主指定用户的所有文件
-user USERNAME
# 查找属组指定组的所有文件
-group GROUPNAME
# 查找属主指定UID的所有文件
-uid UID
# 查找属组指定的GID的所有文件
-gid GID
# -nouser:查找没有属主的文件
find /tmp -nouser
# -nogroup:查找没有属组的文件
find /tmp -nogroup

示例

# 查找 harry 用户拥有的文件,拷贝到目录 /opt/finddir
find / -user harry -exec cp -r {} /opt/finddir/ \; # 查找 /tmp 目录下属组是 song 的文件
find /tmp -group song

2.5 根据文件的类型查找

-type TYPE:
f:普通文件
d:目录文件
l:符号链接文件
b:块设备文件
c:字符设备文件
p:管道文件
s:套接字文件

示例

# 查找/dev目录下所有的块设备文件
find /dev -type b -ls
# 查找/etc目录下的所有符号链接
find /etc -type -l -ls

2.6 组合测试

与:-a,默认组合逻辑;     # find /tmp -nouser -type f -ls
或:-o; # find /tmp -nouser or -nogroup -ls
非:-not,也可以用!表示

示例

# 找出/etc目录下属主为非root的所有文件
find /etc -not -user root -ls # 找出/etc目录下文件名中不包含fstab字符串的文件
find /etc -not -iname "*fatab*" -ls # 找出/etc目录下属主为非root,而且文件名不包含fstab字符串的文件
find /etc -not -user root -a -not -iname "*fatab*" -ls
find /etc -not \( -user root -o -iname "*fatab*" \) -ls

2.7 根据文件的大小查找

-size [+|-]#UNIT
常用单位:k,M,G
#UNIT[#-1,#)
-#UNIT(0,#-1)
+#UNIT(#,oo)

示例

# 查找/etc下所有以.conf结尾的大于10k的文件
find /etc/ -name "*.conf" -type f -size +10k -exec du -a -k {} \; | sort -rn # 查找/etc下所有以.conf结尾的大于10k的文件并复制到/tmp下
find /etc/ -name "*.conf" -type f -size +10k -exec du -a -k {} \; -exec cp -rf {} /tmp/ \;

2.8 根据时间戳查找

2.8.1 以"天"为单位
  -atime [+|-]#
#:[#,#-1) 表示大于等于#,小于#-1,左闭右开的区间 -atime 1
-#:(#,0] 表示小于#,大于0 -atime -1
+#:(oo,#-1] -atime +1
-mtime [+|-]#
-ctime [+|-]#
maxdepth
2.8.2 以"分钟"为单位
-amin
-mmin
-cmin

示例

# 线上删除日志示例(-mmin +1440以分钟为单位表示不够精准,改用秒数)
find /data/search/index/ -maxdepth 1 -daystart -mmin +1440 -type d -exec rm -rf {} \;
find /search/odin/script/data/ -maxdepth 1 -daystart -mmin +1440 -type d -exec rm -rf {} \;
find /search/odin/run/tmp -maxdepth 1 -daystart -mmin +43200 -type d -exec rm -rf {} \;
2.8.3 与特定的文件的时间比较,即,查找比某文件新或某文件旧的文件
# -newer,-anewer,-cnewer选项用于查找与特定的文件比较的已修改或访问过的文件,类似mtime,atime,ctime
# 环境上日志文件太多,想删除某个时间之前的文件,该怎么处理?
# 可以利用如下参数
-newer 指内容最近被修改的文件
-anewer 指最近被读取过的文件
-cnewer 指状态最近发生变化的文件

示例

# 列出比1.log更旧的文件
find ./ ! -newer 1.log |xargs ls -al
# 列出比1.log更新的文件
find ./ -newer 1.log |xargs ls -al

清理线上日志

cat /search/odin/extserver/archive_ext_server.sh
echo "[`date +"%F %T"`]begin to archive logs .."
cd ${PREFIX}
rm -f core.*
# touch一个以当前时间戳为准的隐藏文件
touch -d"$(date -d "1 hour ago")" .rm.time.flag
# 查看log目录下比.rm.time.flag文件更旧的文件并删除
find log ! -newer .rm.time.flag | xargs -I {} rm -f {} 2>/dev/null
echo "[`date +"%F %T"`]done"

清理日志

touch -d"$(date -d'5 days ago')" .clean_time_flag
for dir in log watch/*; do
find ${dir} ! -newer .clean_time_flag | xargs -I{} rm -f {}
done
find download ! -newer .clean_time_flag | xargs -I{} rm -rf {}

2.9 根据权限查找

-perm  [/|-]mode
mode:精确权限匹配 /mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足; find /tmp -perm /666 -ls;find /tmp -perm /002 -ls
9位权限之间存在"或"关系 -mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足
9为权限之间存在"与"关系 # 查找权限为644的(精确权限匹配)
find /tmp -perm 644 -ls

2.10 处理动作

动作 解释
-print 输出至标准输出,默认的动作
-ls 类似于对查找到的文件执行"ls -l"命令,输出文件的详细信息
-delete 删除查找的文件,危险,慎用
-fls /path/to/somefile 把查找到的所有文件的长格式信息(详细信息)保存至指定文件中
-ok COMMAND {} \; 对查找到的每个文件执行由COMMAND表示的命令,每次操作都由用户进行确认
-exec COMMADN {} \; 对查找到的每个文件执行由COMMAND表示的命令;每次操作不需要用户进行确认

示例

# 将其他用户有写权限的文件改名,{}占位符,是引用找到的文件的文件名
find ./ -perm /002 -exec mv {} {}.danger \; #注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性的传递给后面的命令
#但是,有些命令不能接受过长的参数,此时命令执行会失败,另一种方式可规避此问题,find | xargs COMMAND

3. 常见示例

find /var -user root -a -group mall -ls

find /usr -not -user root -a -not -user bin -a -not -user hadoop

find /usr -not \( -user root -o -user bin -o -user hadoop \) -ls

find /etc -mtime -7 -a -not \( -user root -o -user hadoop \) -ls

find /etc -size +1M -type f -ls 

find /etc -size +1M -type f -exec ls -lh {}  \;

查找当前系统上没有属主或属组,且最近一周内曾被访问的文件或目录

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

查找/etc目录下所有用户都没有写权限的文件

find /etc -not -perm /222 -type f -ls
find /etc -not -perm /222 -exec -ls -lh {} \;

查找/etc目录下至少有一类用户没有执行权限的文件

find /etc -not -perm -111 -type f -ls

查找/etc/init.d/目录下,所有用户都有执行权限,且其他用户有写权限的所有文件

find /etc/init.d -perm -111 -a -perm -002 -ls
# 也可以写成
find /etc/init.d -perm -113 -type f -ls

删除/tmp下除passwd以外的其他文件(思路:找出passwd之后取反)

find /tmp -type f ! -name "passwd"|xargs \rm -f
tree /tmp

查看24小时之内修改内容(mtime)的文件

find ./ -mtime 0 或 find ./ -mtime -1

查找当前路径10分钟以内5分钟以外的文件

find ./ -mmin -10 -mmin +5 -type f

查找/search下所有7天以前以log结尾的大于1M的文件移动到/tmp下

find /search -type f -name "*.log" -size +1M -mtime +7 -exec mv {} /tmp \;
find /search -type f -name "*.log" -size +1M -mtime +7 |xargs -i mv {} /tmp

-mtime n 查找系统中最后 n*24 小时被改变文件数据的文件

find ./ -maxdepth 1 -type d -daystart -mtime 1    # 大于24小时,且小于48小时

find ./ -maxdepth 1 -type d -daystart -mtime +1   # 大于48小时,小于72小时

4. 注意事项

# 一般来说这两个参数或命令是一样的。可是在一些情况下尤其是打包压缩的时候差别就很大了。
# find命令找到的文件一次性都给 xargs 处理
find /search -type f |xargs
# -exec find命令找到一个文件 就传递给 exec 处理一次
find /search -type f -exec #默认xargs不支持{}这种形式,xargs加上-i就可以支持,-i参数就可以用{}花括号了。 -exec就是find命令自己的参数,-exec默认的形式是 -exec 命令 {} \;
注意:是以\;结尾的。
{}表示find命令找到的文件。

文件查找工具 find 详解(附:生产示例)的更多相关文章

  1. Linux 执行文件查找命令 which 详解

    某个文件不知道放在哪里了,通常可以使用下面的一些命令来查找: which  查看可执行文件的位置 whereis 查看文件的位置 locate   配合数据库查看文件位置 find   实际搜寻硬盘查 ...

  2. linux之文件查找find grep详解,以及压缩归档

    .find linux里的实时查找工具,通过制定路径完成文件查找. find[options]...[查找路径] [查找条件] [处理动作] 查找路径:查找的位置,默认是当前文件夹. 查找条件:指定查 ...

  3. Linux文件查找命令 find 详解

    关于find命令 由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下.即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权 ...

  4. linux 文件查找 find命令详解

    一,从索引库查找文件:locate 索引库:操作系统会周期性的遍历根文件系统,然后生成索引库 手动更新索引库:updatedb 语法:locate [OPTION]... PATTERN... 只匹配 ...

  5. Linux中3个文件查找相关命令详解

    源于:https://mp.weixin.qq.com/s/VPs-IXY6RoxbltHIxtIbng which命令 我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令 ...

  6. linux管道命令grep命令参数及用法详解---附使用案例|grep

    功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...

  7. IE8“开发人员工具”使用详解上(各级菜单详解)

    来源: http://www.cnblogs.com/JustinYoung/archive/2009/03/24/kaifarenyuangongju.html IE8“开发人员工具”使用详解上(各 ...

  8. 自动化运维工具——ansile详解

    自动化运维工具——ansible详解(一) 目录 ansible 简介 ansible 是什么? ansible 特点 ansible 架构图 ansible 任务执行 ansible 任务执行模式 ...

  9. Linux文本编译工具VIM详解

    Linux文本编译工具VIM详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.VIM概述 1>.vim简介 >.vi: 全称Visual editor,即文本编辑 ...

随机推荐

  1. Apache HTTP Server & WS (websockets)

    Apache HTTP Server & WS (websockets) Apache HTTP Server Version 2.4 https://httpd.apache.org/doc ...

  2. calendar merge date

    calendar merge date componentDidMount () { const { monthDays, // monthDates, } = this.props; const d ...

  3. Taro 物料市场

    Taro 物料市场 taro component demo https://taro-ext.jd.com/ https://taro-ext.jd.com/plugin/view/5caab6c68 ...

  4. “Fatal error: Unable to find local grunt.” when running “grunt” command

    下载到本地 >npm install grunt >grunt 命令行运行:grunt,出现以下问题: 这些是Gruntfile.js中引用的,依次安装: npm install grun ...

  5. SPC空投糖果,是白捡还是风险?

    2020年,币圈刮起了空投风,很多项目纷纷"撒钱"在空投中,在空投中获利多者白捡上百万美刀,少的也薅了万把块羊毛,币圈的空投无时不刻透露着天上掉馅饼的气息.NGK官方在2020年年 ...

  6. MySQL修改表中字段的字符集

    MySQL修改表中字段的字符集 ALTER TABLE 表名 MODIFY 字段名 要修改的属性: 例:ALTER TABLE `guaduates` MODIFY `studentno` CHAR( ...

  7. oracle中关键字的执行顺序

    执行顺序: from where group by having select order by ******当having/select 中出现组函数,那么其他没有被组函数修饰的列就必须出现下gro ...

  8. 心脏滴血(CVE-2014-0160)检测与防御

    用Nmap检测 nmap -sV --script=ssl-heartbleed [your ip] -p 443 有心脏滴血漏洞的报告: ➜ ~ nmap -sV --script=ssl-hear ...

  9. ajax请求添加自定义header参数

    beforeSend: function (XMLHttpRequest) { XMLHttpRequest.setRequestHeader("X-Auth0-Token", g ...

  10. PAT-1064(Complete Binary Search Tree)JAVA实现

    Complete Binary Search Tree PAT-1064 本次因为涉及到完全二叉排序树,所以可以使用数组的形式来存储二叉排序树 对输入序列排序后,得到的是中序遍历二叉排序树的序列.对这 ...