• 认真地记录技术中遇到的坑!
  • 能摸鱼真是太好啦!嘿嘿嘿!

Linux文件查找命令-find

Shell 悠悠 6年前 (2018-03-24) 3423次浏览 0个评论

Linux 文件查找命令find

语法

Linux find命令用来在指定目录下查找文件。find命令的语法如下:

find path -option [ -print ] [ -exec -ok command ] {} \;
  • path 指定查找的路径
  • 任何位于参数之前的字符串都将被视为欲查找的目录名
  • path默认为当前路径,expression默认为-print,即显示所有结果到标准输出
  • -exec command {} \; 将查到的文件执行command操作,注意要有空格
  • -ok 和-exec相同,只不过在操作前要询用户

查询路径

path选项表示查询的起始路径,可以查找path下面的子路径。默认为当前路径。

需要注意:需要对查询的路径永远访问权限才可以查询,遇到没有权限访问的文件时会自动跳过

参考下面的实例

# 列出当前目录及子目录下所有文件和文件夹
find .

# 列出个人文件夹 /home/username 下的所有文件
find ~

# 列出/home文件下的所有文件
find /home

基于文件属性搜索

find命令提供了丰富的文件属性查找选项,比如指定文件类型,文件修改时间,文件大小等。

根据文件名正则进行搜索

最基本的,find命令提供能基于文件名的正则表达式的搜索:

find path -[i]name|-[i]lname|-[i]path|-[i]regex pattern

其中可用的选项的含义如下:

  • -name指定字符串作为寻找文件或目录的范本样式
  • -iname效果和-name一样但是忽略字符大小写
  • -lname指定字符串作为寻找符号连接的范本样式
  • -ilname效果和-lname一样但是忽略字符大小写
  • -path指定字符串作为寻找目录的范本样式
  • -ipath效果和-path一样但是忽略字符大小写
  • -regex指定基于正则表达式匹配,需要注意正则表达式中特殊字符的转义
  • -iregex效果和-regex一样但是忽略字符大小写
  • -prune指定字符串作为寻找文件或目录的不匹配范本样式

常用的文本匹配选项有:

  • *表示通配符匹配,如”*Controller.php”
  • {1,3}表示匹配1或者3
  • [0-10]表示匹配0到10的数值
# 查找当前目录下的所有log文件
find . -name ".log"

# 查找/home目录下所有的.php文件并且忽略大小写
find /home -iname ".php"

# 查找当前目录及子目录下所有以.png和.jpg结尾的文件
find . -name "*.png" -o -name "*.jpg" 
# 可以写成下面的形式
find . \( -name "*.png" -o -name "*.jpg" \)

# 基于正则表达式查找
find /home -regex ".*\(\.png\|\.jpg\)$"

# 查找/etc目录下的所有文件以及log结尾的目录
find /etc -path "*log"

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

根据文件类型进行搜索

find命令可以根据文件类型来进行查找:

find . -type [b/d/c/p/l/f]

参数类型列表含义如下:

  • f 普通文件
  • l 符号连接
  • d 目录
  • c 字符设备
  • b 块设备
  • s 套接字
  • p Fifo
# 查询当前目录下的所有文件夹
find -type d

根据文件大小进行匹配

find命令可以根据大小进行查找:

find path -size [+-][n][u]
  • +- 表示大于还是小于,值可为:
    • -表示小于指定大小
    • +表示大于指定大小
    • 空值不填表示等于指定大小
  • n 表示数值,如100等
  • u 表示单位,可为:
    • b 块(512字节)
    • c 字节
    • w 字(2字节)
    • k 千字节
    • M 兆字节
    • G 吉字节
# 查询当前目录下大于10K的文件
find -type f -size +10k

# 查询当前目录下等于10K的文件
find -type f -size 10k

# 另外,可以使用以下命令来查找当前目录下所有长度为零的文件和目录:
find . -empty

根据文件权限进行匹配

find命令可以根据文件权限和所有者进行查找:

find path -perm|-user|-group value

其中各项选项含义如下:

  • -perm表示指定权限值,此时value可为如777的权限代码
  • -user表示指定用户,此时value为用户名
  • -group表示指定用户组,此时value为用户组名
  • -group表示指定用户组,此时value为用户组名
  • -nouser表示不属于本地主机用户
  • -nogruop表示不属于本地主机用户组
# 搜索当前目录下出权限为777的php文件
find . -type f -name "*.php" -perm 777

# 找出当前目录下权限不是644的文件
find . -type f ! -perm 644

# 找出当前目录用户uusama拥有的所有文件
find . -type f -user uusama

# 找出当前目录用户组nginx拥有的所有文件
find . -type f -group nginx

根据文件时间戳进行查找

find命令提供了基于诸如访问时间等时间戳来搜索文件:

find path -atime|-mtime|-ctime|-newer [+-]time

其中各个可选选项的含义如下:

  • -atime用户最近一次访问时间,按照天算
  • -amin用户最近一次访问时间,按照分钟算
  • -mtime文件最后一次修改时间,按照天算
  • -mmin文件最后一次修改时间,按照分钟算
  • -ctime文件数据元(例如权限等)最后一次修改时间,按照天算
  • -atime文件数据元(例如权限等)最后一次修改时间,按照分钟算
  • -newer表示更改时间较指定文件或目录的更改时间更接近现在
# 搜索当前目录下最近三天内被访问过的所有文件
find . -type f -atime -3

# 搜索当前目录下最近一个小时修改过的.log文件
find . -type f -name "*.log" -mmin 60

# 找出当前目录下在login.php修改之后的文件或者目录
find . -newer login.php

指定搜索结果行为

find命令还可以对查找的文件进行诸如删除等操作。

对查询到的文件进行删除

可以使用-delete选项来对查询到的文件删除:

# 删除当前目录下所有.tmp文件
find . -type f -name "*.tmp" -delete

对查询结果执行简单命令

可以使用-exec-ok来对查询结果执行简单命令,-ok-exec效果一样,只不过-ok会给出询问提示是否要执行想要操作。

需要注意,这些命令的格式,结尾为命令加上空格加上大括号加上空格加上反斜杠,最后的空格加反斜杠一定不能少,否则会报缺少参数的错误。

find path -exec command {} \;

看下面的例子:

# 找出当前目录下所有root用户的文件和目录并修改拥有者为uusama
find . -user root -exec chown uusama {} \;

# 将30天前的.log文件移动到old目录中
find . -type f -mtime +30 -name "*.log" -exec mv old {} \;

# 查找系统中所有文件长度为0的普通文件,并列出它们的完整路径
find / -type f -size 0 -exec ls -l {} \;

# 查找/var/logs目录中更改时间在7日以前的普通文件,并在删除之前询问它们
find /var/logs -type f -mtime +7 -ok rm { } \;

# 找出当前用户目录下所有的.tmp文件并且删除
find $HOME/. -name "*.tmp" -ok rm {} \;

# 找出当前目录下所有.log文件并以“File:文件名”的形式打印出来
find . -type f -name "*.log" -exec printf "File: %s\n" {} \;

# 查找当前目录下所有access*.log文件并把他们拼接起来合并到access.log文件中
find . -type f -name "access*.log" -exec cat > access.log {} \;

如果想要对查询结果执行复杂的命令,可以预先把多个命令写入到.sh文件中,然后调用这个.sh文件

# 查找当前目录下所有.txt文件并调用filter.sh文件处理
find . -type f -name "*.txt" -exec ./filter.sh {} \;

其他的一些选项

指定查找深度

可以用-depth从指定目录下最深层的子目录开始查找。

# 从当前目录下最深目录开始查找
find -depth

转载请注明出处 Linux文件查找命令-find
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址