查找命令
- find:用于搜索文件,通过属性搜索文件
- grep:用于搜索文件内容,正则表达式
- locate:根据文件名搜索本地的磁盘文件
find
1.根据文件名查找(-name)
常用通配符:
- *:可以匹配0个或多个字符
- ?:用于匹配单个字符
1 |
|
2.根据文件类型查找(-type)
文件类型 | 字符描述 |
---|---|
普通文件 | f |
目录文件 | d |
软链接文件 | l |
字符设备文件 | c |
块设备文件 | b |
管道文件 | p |
本地套接字文件 | s |
1 |
|
3.根据文件大小查找(-size)
- -size 4k 表示区间(3k, 4k]
- -size -4k 表示区间[0k, 4k]
- -size +4k 表示区间(4k, 正无穷)
1 |
|
4.限制查找的目录层级(-maxdepth, -mindepth)
- -maxdepth:最多搜索到第多少层目录
- -mindepth:最少搜索到第多少层目录
这两个参数不能单独使用。
1 |
|
5.同时执行多个操作(-exec, -ok)
问题: find . -name “ *. txt” | grep “a”中find后面可以使用|管道传递给grep,但是不能使用管道传递给ls,例如find . -name “ *.cpp” | ls
1.为什么 find . -name “*.txt” | grep “a” 可以工作?
- find . -name “*.txt” 会搜索当前目录及其子目录下所有扩展名为 .txt 的文件,并将这些文件名输出到标准输出(stdout)。
- grep “a” 会从标准输入(stdin)读取数据,然后搜索包含字符串 “a” 的行,并将这些行输出到标准输出。
- 管道 | 将 find 命令的输出作为 grep 命令的输入,因此 grep 可以接收到文件名并进行搜索。
2.为什么 find . -name “*.cpp” | ls 不能工作?
- ls 命令通常用于列出目录中的文件和目录,而不是处理文件名列表。
- find . -name “*.cpp” 会输出一系列文件名,但 ls 命令期望的是目录路径作为参数,而不是文件名列表。
可以使用exec
,ok
,xargs
实现find命令执行完毕之后。再执行其他子命令。
exec
-exec
是find的参数。可以在exec参数后添加其他需要被执行的shell命令,命令的尾部需要加一个后缀{} \;
,{}
和\;
中间用空格分开。
1 |
|
ok
-ok
也是find命令的参数,是交互式的命令。
1 |
|
xargs
Unix命令,将接收到的输入数据转换为命令行参数,并构建一个完整的命令。通常与管道(|)组合使用。
1 |
|
grep
- -r:递归搜索目录中的文件内容
- -i:对应要搜索的关键字,忽略字符大小写
- -n:在现实符合样式的那一行之前,标出该行的行号
1 |
|
locate
locate不搜索具体目录,而是搜索本地的数据库文件,这个数据库包含本地的所有信息。在使用locate之前,先使用updatedb
命令手动更新数据库。
1 |
|
查找命令
http://example.com/2025/02/22/Linux/查找命令/