Shell Command: Find
本网站相关文章:
- 文件-基本操作集
- 文件-过滤
- 文件-find
- 文件-grep
- 文件-locate
- 文件-lsof
- 文件-redirect
- 文件-regex
- 文件-rsync
- 文件-sed
- 文件-tar
- 文件-xargs
Introduction
Definity
Find–Walk a file hierarchy(层级). 相比其他命令, 其功能非常强大, 其用法也非常繁杂. Find 常常与xargs搭配使用.
Format
format: find ${start_directory} ${test} ${options} ${criteria to match} ${action to perform on results}
start_directory
: 作用根目录- test: 检查条件, 当且仅当测试为 True 时才会进行后续的操作, 否则进行下一个文件的检查, 匹配, 操作
- options: 参数选项, 例如 mtime, 见下文介绍
- criteria to match: shell 匹配表达式
- action to perform on results: 对结果的操作, 如果搭配 xargs 使用, 一般不会使用当前项.
除了上述的各个阶段之后, 还存在Operators
来连接不同的 expression, 其中 expression 就会包括上面的所有阶段.
Expression
test
只有测试成功返回 TRUE 的 item 才会进行后续的 options, match, action, 下面给出各个 test 参数. 其中数字参数n
有三种情况:
- +n 返回项大于 n, 例如 n 天之后
- -n 返回项小于 n, 例如 n 天之前
- n 返回项正好与 n 相等, 例如 3 天前, 不包括 4 天前
其他 test 选项会在下面给出, 仅仅给出一些常见的例子, 其中关于 n 的语法这里不再说明. 文件访问, 修改时间:
- amin n: 读取和访问时间, 以分钟为单位, 例外还有(atmin, mtime, ctime, 以天为单位)
- mmin n: 上次内容修改时间
- cmin n: 上次状态更改时间
- newer file: 比文件 file 还近的更改时间
- empty: 空文件
- executable: 可执行文件
文件所有者:
- user: 基于用户名查找
- group: 基于组名查找
- uid: 基于 UID 查找
- gid: 基于 GID 查找
- nouser: 基于没有属主查找
- nogoup: 基于无属组查找
文件名:
- name: 匹配模式, 使用 shell 模式进行匹配
- iname: 不分大小写
- lname: 对软链接文件进行模式匹配
- ilname: 不区分大小写
- links n: 对硬链接文件
- regex: 基于正则表达式
- iregex: 匹配模式
文件类型:
- type: 基于文件类型查找(f/d/b/c/l/s/p)
- size: 【+|-】SIZE 单位: b-512, c-bytes, w-two bytes, k-Kib, M-Mib, G-Gib
- context pattern: 文本包含
路径查找:
- path pattern: 注意, 这是一个 pattern, 即对 find 命令前面部分的结果的一种正则匹配, 这一点非常重要
- perm: MODE 基于精确权限查找
- perm:
/MODE
任何一位匹配即可 - perm:
-MODE
同时符合,与关系
所以, 在使用-path
选项时, 第一部分路径需要和后续 path 的正则匹配, 否则永远找不到想要的文件:
1 | # True |
Options
Positions Options
和 Global Options
一直返回 True, 其仅仅会影响经过test
过滤之后的数据. 关于软链接文件:
- -L: 输出软连接文件实际的文件, 而不是连接文件本身
- -P: 默认行为, 不会输出实际软链接文件
- -H: 当需要对每一个文件进行单独的处理时, 此时需要操作软链接本身文件
Global Options:
-d/--depth
: 深度优先排序算法查找- maxdepth levels: 最大深度
- mindepth levels: 最小深度, 例如使用 mindepth 来忽略根目录本身
- mount: 不操作其他文件系统的文件
Actions
- delete: 对于返回到这一步的所有文件, 直接进行删除操作, 一步到位, 够男人
- exec command ; : 逐一执行命令, 0 表示成功, 参数由 exec 到
;
之间值组成, 使用\
来转义;
- execdir command; : 对包含文件的目录执行
print0
: 输出到 stdoutfprint file
: 将输出全部打印到 file 中- fprintf file format: 以指定格式打印文件
- ls: 以
ls -dils
打印到 stdout 中 fls /PATH/TO/SOMEFILE
, 将查找到的文件已 ls -l 格式保存到文件中ok COMMAND {} \;
, 查找到的文件传递给命令 COMMAND,每一步都需要提示确认
Operators
( expr )
: 优先执行! expr
: 当且仅当 expr 返回 False 时, 可以使用-not 来替代expr1 expr2
: 两个条件都必须生效, 类似: expr1 -a expr2, 如果前面失败, 后面的表达式就不会执行expr1 -a expr2, expr1 -and expr2
: 并条件expr1 -o expr2, expr1 -or expr2
: 或条件expr1, expr2
: 不管如何, 两个 expr 都会执行完毕
关于 expression 的组合:
1 | # 默认为-and,其他还有(!expr, -not expr, -a/-and/-o/-or/) |
Example
在 cscope 中, 使用-L 来遍历链接文件(实际文件):
1 | # 查看所有的.h, .c, cpp, java, py, php文件并放到cscope库中, 以便后续的查找 |
按照文件大小查找
1 | # 例如大于5MB |
多选项查找
1 | # 查找当前目录下所有的以.c, .h结尾的所有文件 |
按照文件权限和所有者进行查找
1 | # 普通, 777文件 |
设置忽略根目录, 并设置最大搜索深度
1 | # mindepth 默认为0 |
参考
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 狂想写作本!
评论