首页 » find - 搜索文件

Linux find 命令行参数

Linux find命令用于搜索文件,最简单的使用形式如:

$ find ./ -name *.cpp           # 搜索当前目录下所有的 .cpp 文件
$ find ./ -perm /+x -type f     # 搜索当前目录下所有的可执行文件
$ find ./ -type d               # 搜索子目录

Linux find命令有很多参数,主要有以下分类:

  • 根据文件大小搜索(-size
  • 根据文件的创建、访问时间搜索
  • 根据文件的读、写、执行等属性搜索
  • 根据文件类型搜索,如普通文件、目录、socket文件等(-type
  • 指定搜索深度(-maxdepth
  • 大小写不敏感搜索(-iname
  • 搜索时排除路径(-prune
  • 对匹配的文件调用其他命令处理(-exec

要将 find 匹配的文件进行进一步的处理,有两种常见方法:

  1. 通过-exec选项,如 find ./ -name "*.cpp" -exec grep author_name {} \;
  2. 通过管道,如 find ./ -name "*.cpp" | xargs grep author_name

find 的选项很多,而且将选项组合使用更是让人眼花缭乱,以下是常见的 find 使用方法。

Linux find 示例

搜索可执行文件

使用-perm /+x参数。

例如搜索用户目录下的php可执行文件:

$ find ~ -name "php" -perm /+x

这个命名把php目录也搜索出来可,可使用-type f指定只搜索文件:

$ find ~ -name "php" -perm /+x -type f

查找所有可执行文件

find ~ -perm 775

排除查找路径

排查查找路径的伪代码如下:

$ find PATH-EXCLUDE-EXPR -o -name TARGET-FILE

这是一个条件语句。A -o B的条件语句,如果A为true,就直接返回true,不执行B了。

在find中,如果PATH-EXCLUDE-EXPR为true,同样就直接返回,不执行之后的 -name 匹配,这样就达到排除指定路径不搜索的目的。PATH-EXCLUDE-EXPR的形式如-path PATH-EXCLUDE -prune,或者-path PATH-EXCLUDE -a -prune

在当前路径下搜索.php文件,并排除vendor目录:

$ find ./ -name *.php|wc -l
657
$ find ./ -path "./vendor" -prune -o -name *.php|wc -l
629

排除多个目录:

$ find ./ -path ./vendor -prune -o -path *wp -prune -o -name *.php|wc -l
253
$ find ./ \( -path ./vendor -o -path *wp \) -prune -o -name *.php|wc -l
253

对匹配文件的进一步处理

使用-exec参数

find ! -size +500c -exec cp {} /tmp \;

创建时间大于50分钟的日志文件移至 old 目录

find -maxdepth 1 -type f -cmin +50 -name "*.log" -exec mv {} old \;

用fgetana.py分析所有的日志文件

find -maxdepth 1 -type f -name "*.log" -exec ./fgetana.py --speed {} \;

根据大小查找文件

查找<10k && >8k 的文件

find ./  -type f -size -10k -size +8k -exec ls -l {} \;

指定搜索深度

指定查找深度

find . -maxdepth 1 -perm 775        # -maxdepth 必须在 -perm 之前

不显示 find 错误输出

用find搜索文件时,如果没有访问权限,则会报如"Permission denied"或“禁止访问”之类的错误。可以将错误重定向到/dev/null

$ find ./ -name "*.php" 2>/dev/null

删除文件名古怪的文件(利用inode):

$ ls -i
15826968 *?A
$ find ./ -inum 15826968 -exec rm -i {} \;

分享

0