优秀的编程知识分享平台

网站首页 > 技术文章 正文

Linux find命令一定要知道这些(linux find命令的使用)

nanyue 2024-09-10 16:12:39 技术文章 4 ℃

find命令举例

举一个日常可能使用的例子,对这个例子有了概念,后面的内容就非常简单了。

  • 在当前目录及子目录下,查找2天之内修改过的.c文件,并在这些文件中搜索open字符串:
find  . -name  '*.c' -and -mtime -2 -print -and -exec grep -rn 'open'  {}  \;

运行结果如下:

[final@ ~/cmds]find  . -name  '*.c' -and -mtime -2 -print -and -exec grep -rn 'open'  {}  \;
./no-open.c
./open-create.c
7:        fd = open("hello.txt", O_RDWR | O_CREAT);
9:                printf("open failed...\n");
12:        printf("open hello.txt successfully.\n");
[final@ ~/cmds]

find命令功能介绍

find命令在目录下递归的搜索文件,并对成功匹配的文件执行指定的操作。

命令格式:

find [starting-point...] [expression]

或者

find [目录列表] [表达式]

说明:

[starting-point…]为目录列表,如果没有指定时,则从”.”开始。

[expression],也就是表达式,[starting-point…]之后的内容就是表示式,理解了表达式就理解了find的精髓。简单来讲,表达式描述了查找什么样的文件,以及对成功匹配的文件执行什么样的操作。

表达式(expression)介绍

find命令的expression有多部分组成,但最主要的有3部分:

  • Tests(测试): 用来指出查找什么样的文件,例如: -name '*.c'
  • Actions(操作): 用来指出对查找成功的文件做什么操作,如删除(rm), 显示(cat),搜索内容(grep)等
  • Operators (运算符): 用来表达复合的条件,包括and(逻辑与),or(逻辑或),!(逻辑非)。例如: 同时查找’.c’文件和’.cpp’文件,就需要使用: -name '*.c' -and -name '*.cpp'

这样find命令就可以表示为:

find [文件列表] [Test1 Operator Test2…] [Action1 Operator Actions2…]

其中,为了保证正确的优先级,对于用Operator连接的项,可以使用()来组合优先级,例如:

find .  \( -name '*.c' -and -mtime -2 \) -print -and -exec grep -rn 'open' {} \;
  • Tests(测试条件,查找文件的判定条件)

Tests用于指出查找什么样的文件,主要的选项包括:

-name ‘字符串’ : 查找文件名匹配所给字符串的所有文件,字符串可以使用通配符*、?、[ ]

-iname ‘字符串’ : 和 -name 类似, 但是 -iname 不区分大小写

-gid n: 查找属于ID号为n的用户组的所有文件

-uid n: 查找属于ID号为n的用户的所有文件

-group 组名: 查找属于组名为所给 组名 的所有文件

-user 用户名: 查找属于用户名为 用户名 的所有文件

-perm mode: 根据文件权限进行查找

-regex pattern: 文件名按照正则表达式 pattern来匹配

-size n [bckwMG]: 查找指定文件大小的文件,n后面的字符表示单位,默认为b,代表512字节的块

-type x: 查找所有类型为x的文件,x为下列字符之一

b: 块设备文件

c: 字符设备文件

d: 目录文件

p: 有名管道(或命名管道)文件

f: 普通文件

l: 符号链接文件

s: socket文件

若以时间为条件查找,参数如下。

(1)-amin n: 查找n分钟以前被访问过的所有文件。

(2)-atime n:查找n天以前被访问过的所有文件。

(3)-cmin n:查找n分钟以前文件状态被修改过的所有文件。

(4)-ctime n:查找n天以前文件状态被修改过的所有文件。

(5)-mmin n:查找n分钟以前文件内容被修改过的所有文件。

(6)-mtime n:查找n天以前文件内容被修改过的所有文件。

对于时间中的 n值,还可以指定+n, -n

+n: 比n大

-n: 比n小

n: 等于n

对于时间相关的理解,可以参考本文后面的举例。

  • Actions(操作,对匹配成功文件做的操作)

Actions用来指出对查找成功的文件做什么操作。

-delete : 删除查找到的文件或目录

-exec command {} : 对符合条件的文件执行command命令,而不询问用是否需要执行该命令。{}表示命令的参数,即为匹配成功的文件,命令的末尾必须以“\;”束,“{}”和“\;”之间必须有一个空格。

-ok command {} : 对符合条件的文件执行command命令,与exec不同的是它会询问用户是否需要执行该命令,用户先要用 y/n 响应。

-ls:详细列出找到的所有文件。

-print:在标准输出设备上显示查找出的文件名。如果整个表达式中没有Actions,则默认执行 -print。

-fprint file: 将找到的文件名写入file文件中。

-prune: 如果该文件是一个目录,则不进入它。

  • Operators(逻辑运算符,因为expression中可能存在多个条件,所以需要逻辑运算)

find 命令提供的寻找条件可以是用逻辑运算符not、and 和or 组成的复合条件。逻辑运算符 not、and和or 的含义如下:

and: 逻辑与,在命令中用“-a”表示,是系统默认的选项,表示只有当所给的条件都为真时,结果才为真,有任何一个条件为假时,则最终结果为假。也可以用 “-and”,但不符合POSIX。

or: 逻辑或,在命令中用“-o”表示。该运算符表示只要所给的条件中有一个条件为真,就算满足条件,最终结果为真。也可以用 “-or”, 也可以用 “-and”,但不符合POSIX。

not: 逻辑非,在命令中用“!”表示。该运算符表示查找不满足所给条件的文件。也可以用”-not”表示,但不符合POSIX。

另外,对于这些逻辑运算,find支持通过使用()来保证优先级。由于括号对于shell来说是特殊的,所以通常使用反斜杆(\)进行转义。例如: 可以使用’\(…\)’而不是’(…)’。

例如: 查找当前目录下以core开头的普通文件并删除掉

这里明确要求删除的是普通问题,不能是目录,这是就需要复合条件来判断。

find . -name 'core*' -and -type f -delete 或 find . -name 'core*' -a -type f -delete
  • Global Options(expression中的全局选项)

其实对于find命令中的expression,它还包括global option,也就是全局选项。一般来说,全局选项应在命令行上的starting-point…列表之后,第一个Tests之前指定。

主要的global option(全局选项):

-d、-depth : 在查找文件时, 首先查找当前目录中的文件, 然后再在其子目录中查找

-maxdepth n : find 查找目录的最大深度, -maxdepth 0 意味着仅将测试和操作应用于starting-point…本身。

-mindepth n : find 从指定的目录的第几层深度开始查找

-mount : 查找文件时不跨越文件系统的 mount 点

这样在expression中带有全局选项的find命令如下:

find [文件列表] [全局选项] [Tests] [Actions]

例如:

find . -maxdepth 1 -name "*.c" -exec grep -rn open {} \;

find常命令用举例

按名字及通配符查找

  • 查找当前目录下所有.c文件的详细信息
find . -name '*.c' -ls
  • 查找当前目录下以n字母开头命名的文件
find . -name '[n]*'

按文件权限查找

  • 查找系统中权限为 777 的文件或目录, 并使用 ls -l 查看其详细信息
find / -perm 777 -ls

按文件的属主或属组查找

  • 查找系统中属主和属组为 root的文件或目录
find / -user root -group root

按大小或文件类型查找

  • 查找系统中文件大小大于100M的文件
find / -type f -size +100M
  • 查找系统中文件大小小于100M的文件
find / -type f -size -100M
  • 查找当前目录下的普通文件、目录文件或链接文件
find . \( -type f -o -type d -o -type l \)

按时间查找

  • 查找home目录下3天之内被更改过的文件
find /home -mtime -3
  • 查找home目录下3天前的那一天更改过的文件
find /home -mtime 3
  • 查找home目录下3天之前更改过的文件
find /home -mtime +3

对匹配成功的文件执行动作

  • 查找当前目录下所有的.c文件,并修改这些文件的权限为666
find . -name '*.c' -exec chmod 666 {} \;
  • 查找./reop目录下所有的.c文件,并删除
find ./repo/ -name '*.c' -delete
  • 在当前目录及其子目录中查找所有的’.c’文件,并且其在2天之内修改过,然后打印文件名,并在这些匹配成功的文件中,显示调用open的行及行号。
find . -name '*.c' -and -mtime -2 -print -and -exec grep -rn 'open' {} \;

-ok的使用

  • 查找当前目录下的目录文件,并显示目录中的内容
find . -type d -print -exec ls {} \;
find . -type d -print -ok ls {} \;

“-exec cmd {} \;”与“-ok cmd {} \;”项类似,只不过前者直接执行 cmd 命令,而后者先要用 y/n 响应。

把查找结果保存到文件中

  • 查找当前目录扩展名为.c的文件,查找深度不超过3级,并把结果保存到~/c_file.txt中
find ./ -maxdepth 3 -name "*.c" -fprint ~/c_file.txt
  • 查找当前目录扩展名为.c的文件,并按格式保存到文件中
find . -name '*.c' -fprintf ./c_file.txt '%-10s %p\n'

Tags:

最近发表
标签列表