find常用命令示例

写在前面

在类unix操作系统中,find命令用于一个或多个目录树中查找文件。本文不会详细介绍find命令的用法,因为man find足以告诉我们这些信息。本文只是我的一个学习笔记,记录一下自己的学习过程及归类总结find的一些常用命令。

用法简述

find命令基本结构:

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]

path可以是一个或多个目录,这里最主要的是express,expression可以由options,tests和actions,翻译成人话就是可以按照多个维度自由组合查找条件,再在这些查找出来的文件中执行actions操作。

从查找的维度来说包括:

  • 文件名(可以通过正则匹配)
  • 文件类型
  • 文件大小
  • 时间
  • 组和用户
  • 访问权限
  • 目录层级
  • 符号链接

我们可以按照以上条件自由组合查找目标文件,一旦过滤出这些文件,我们可以执行常用的一些actions:

  • 打印
  • 文件操作(复制、移动、重全名、删除等)
  • 修改文件权限
  • 修改文件用户组

常用实例

1. 在指定目录下查找文件

在根目录下搜索名为passwd的文件:

shell> find / -type f -name 'passwd'

其中,-type表示根据文件类型查找f表示普通文件,更多类型请man find-name表示从文件名进行匹配,后面可以用正则表达式,这里用了最简单的字符串匹配。如果忽略文件名大小写,用-i参数:

shell> find / -type f -iname 'passwd'

2.在指定目录下查找文件大于200M的文件

shell> find / -size +200M

其中-size参数表示从文件大小维度进行查找,后接口文件大小,和单位,默认是块(512 byte),文件大小前可以带+-表示范围大于,小于,不带表示等于。
文件大小单位包括:

单位 说明
b 块,512字节为一块
c 字节
w 双字,2字节为一字
k 千字节,1024字节
M 兆,1024k
G 吉,1024M

3.根据时间查找

根据时间维度查找又可以分为三个子维度条件进行查找,如下:

操作 Meaning 查找参数
访问(access) 读取文件内容时记录的时间 -atime,-amin
修改(modification) 修改文件内容时记录的时间 -mtime,-mmin
修改状态(change of status) 修改文件名或文件属性(权限、拥有者等) -ctime,-cmin

查找15分钟之前修改的文件:

shell> find . -type f -amin +15

查找1天前修改的文件:

shell> find . -type f -atime +1

按照访问时间、修改状态时间查找类似;除此之外还可以以一个文件的基准,查找比这个文件修改时间更新的文件:

shell> find . -type f -newer test.txt

4.根据用户或组维度查找文件

查找属于sedlav的文件

shell> find . -type f -user sedlav 

查找属于mysql组的文件夹:

shell> find /  -type d -group mysql

5.根据访问权限查找文件

权限表示完全跟用户、组、其它用户表示权限的方法一致:

Perm Octal Symbolic
Read 4 r
Write 2 w
Execute 1 x

查拥有者和组用户具有读写权限,其它用户拥有读权限的文件:

shell>find . -type -perm 644

6. 在指定目录层级中查找

可以指定查找的具体的目录层级,或目录层级范围:

参数 说明
-depth levels 目录层级
-maxdepth levels 最小目录层级
-mindepth levels 最大目录层级

从根目录开始,最多查找3层,查找名为passwd的文件:

shell> find / -maxdepth 3 -name 'passwd'

7.过滤错误信息

如果你没有root权限,在/目录下执行上例命令时,你会看到很多错误信息,如何将这些错误信息过滤掉呢?只需要交错误信息重定向到/dev/null中就可以了:

shell> find / -maxdepth 3 -name 'passwd' 2>/dev/null

8. 重命名查找出的文件

根据上面例子中的各种维度,我们可以筛选出目标文件,然后在目录文件上执行actons操作,默认情况下执行的是print,即将目标文件打印出来,除此之外,我们可以使用-exec参数执行更多操作,如:

将当前目录下所有后缀为.php的文件备份到/tmp目录下:

shell>find . -type f -iname '*.php' -exec cp {} /tmp \;

将当前目录下所有的后缀为.htm文件重命名为后缀.html

shell> find . -type f -iname '*.htm' -exec sh -c 'mv {} $(basename {} .htm).html' \;

将当前目录下,所有mp3文件名中的空格(blank)替换为下划线_

shell> find . -type f -iname “*.mp3″ -exec rename “s/ /_/g” {} \;

更多参考

  1. https://en.wikipedia.org/wiki/Find_(Unix)

  2. https://www.librebyte.net/en/bsd/25-practical-examples-of-the-find-command/

3.https://www.thegeekstuff.com/2009/03/15-practical-linux-find-command-examples/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 进入带空格的文件或者文件夹 Linux文件权限详解 文件和目录权限概述 在linux中的每一个文件或目录都包含有访...
    annkee阅读 2,715评论 0 4
  • for example: find . -name "[1-9]*" 或 find -name "[1-9]*"...
    lionlee99阅读 596评论 0 0
  • Linux习惯问题: 在vim编辑时,按了ctrl + s后,再按ctrl + q就可以继续执行了。ctrl + ...
    光着脚的鞋阅读 4,550评论 0 16
  • 雨说前端阅读 148评论 0 3
  • 随着年龄的增长,更愿意自己独处一隅,静静的呆着,感觉全世界都是我的,任思绪飞扬, 想想小时候的童真,想...
    b5804873568c阅读 218评论 0 2