工具find、locate、grep、whereis/which、type。
find支持多种参数,这里列举常用的,更多请参考:find 命令
常用条件
-type 类型参数
f 普通文件
l 符号连接
d 目录
c 字符设备
b 块设备
s 套接字
p Fifo
-iname 忽略大小写
-path 匹配文件路径或者文件
-regex 基于正则表达式匹配文件路径(-iregex忽略大小写)
! 否定参数,否定条件
-maxdept 最大查找深度
-mindepth 最小查找深度
根据文件时间戳进行搜索
访问时间 (-atime/天,-amin/分钟):用户最近一次访问时间。
修改时间 (-mtime/天,-mmin/分钟):文件最后一次修改时间。
变化时间 (-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
- 搜索最近(<7, ==7, >7)天被访问过的所有文件
find . -type f -atime -7 # 七天内
find . -type f -atime 7 # 整七天
find . -type f -atime +7 # 大于7天
-newer 与指定文件比较。
find . -type f -newer file.lo # 找出比file.log修改时间更长的所有文件
-size 根据文件大小进行匹配
b —— 块(512字节)
c —— 字节
w —— 字(2字节)
k —— 千字节
M —— 兆字节
G —— 吉字节
- 搜索(大于,等于,小于)10KB的文件
find . -type f -size +10k
find . -type f -size 10k
find . -type f -size -10k
文件操作
-delete 删除匹配文件
find . -type f -name "*.txt" -delete #删除当前目录下所有.txt文件
更多使用技巧请参考:https://wangchujiang.com/linux-command/c/find.html
find /usr/include/ "set.h" | grep "set.h$"
# 起始路径 关键词 过滤 以"set.h"结尾的
目录结构
递归删除所有后缀为 .c
的文件
或者,我们可以选择递归删除所有后缀为 .c
或.cpp
的文件
locate命令维护了一个数据库,我们在使用之前应该先更新数据库否则查询不到最新的文件。
参数
-b, --basename # 仅匹配路径名的基本名称
-c, --count # 只输出找到的数量
-d, --database DBPATH # 使用DBPATH指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db
-e, --existing # 仅打印当前现有文件的条目
-1 # 如果 是 1.则启动安全模式。在安全模式下,使用者不会看到权限无法看到 的档案。这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的 权限资料。
-0, --null # 在输出上带有NUL的单独条目
-S, --statistics # 不搜索条目,打印有关每个数据库的统计信息
-q # 安静模式,不会显示任何错误讯息。
-P, --nofollow, -H # 检查文件存在时不要遵循尾随的符号链接
-l, --limit, -n LIMIT # 将输出(或计数)限制为LIMIT个条目
-n # 至多显示 n个输出。
-m, --mmap # 被忽略,为了向后兼容
-r, --regexp REGEXP # 使用基本正则表达式
--regex # 使用扩展正则表达式
-q, --quiet # 安静模式,不会显示任何错误讯息
-s, --stdio # 被忽略,为了向后兼容
-o # 指定资料库存的名称。
-h, --help # 显示帮助
-i, --ignore-case # 忽略大小写
-V, --version # 显示版本信息
虽然 locate 命令没有直接指定目录的参数,但是该命令支持模糊查询,例如使用*
省略若干路径。
查询anaconda的日志文件:
当前目录查询:注意,指定在当前目录查询时,尽量给出绝对路径、形如 ./* 这类的相对路径不起作用(但是可以使用家目录的相对路径)。
查询当前路径下的tcp开头的文件。这里需要先使用pwd打印出工作目录的路径,然后拼接出关键词即可。注意这里的查找条件, *\tcp 与 *tcp* 的查找结果并不相同。
另外,如果我们使用 -i 参数忽略大小写可以得到跟多匹配内容。
grep一般用于 连接管道的过滤命令使用,不过管道也可充当查询文件的工具。
基本参数
-i 搜索时,忽略大小写
-c 只输出匹配行的数量
-l 只列出符合匹配的文件名,不列出具体的匹配行
-n 列出所有的匹配行,显示行号
-h 查询多文件时不显示文件名
-s 不显示不存在、没有匹配文本的错误信息
-v 显示不包含匹配文本的所有行
-w 匹配整词
-x 匹配整行
-r 递归搜索
-q 禁止输出任何结果,已退出状态表示搜索是否成功
-b 打印匹配行距文件头部的偏移量,以字节为单位
-o 与-b结合使用,打印匹配的词据文件头部的偏移量,以字节为单位
grep工具与其他查找文件工具不同的是,它用于文本文件的内容查找,或者叫他文本搜索工具。
例如,我们想查看某个文件的内容,一般解决思路是找到文件位置,在打开文件查看,而grep把这另个步骤简化。
现有web网页,网页上有“祝大家圣诞快乐”文字样式。
在网站根目录下有很多文件,我们现在想找出含有"祝大家圣诞快乐"的所有网页。
利用grep命令即可实现。 grep -r "祝大家圣诞快乐" ./
此方法,在查找一些配置,查找日志文件时非常的好用。
例如,查看apache配置文件中有关cgi的部分。
例如,查看当前PS1在哪个配置文件中
PS1(Prompt Sign)是一级终端命令提示符,如果想修改当前命令提示符样式只需根据PS的语法对其赋值即可。现在我们需要看一下当前PS1正在哪个配置文件中生效。
注,在~/.bashrc、~/.bash_profile、/etc/bashrc、profile文件中PS1的配置均可生效。具体差别为:
- /etc/profile
此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。【所有用户,第一次登录时生效】- /etc/bashrc(ubuntu为 /etc/bash.bashrc)
为每一个运行 bash shell 的用户执行此文件。当 bash shell 被打开时,该文件被读取。【所有用户,开启bash时生效】- ~/.bash_profile(ubuntu为 ~/.profile)
每个用户都可使用该文件输入专用于自己使用的 shell 信息。默认情况下,它设置一些环境变量,执行用户的~/ .bashrc 文件。【当前用户,登录时生效】- ~/.bashrc
该文件包含专用于你的 bash shell 的 bash 信息,当登录时以及每次打开新的 shell 时,该文件被读取。【当前用户,开启bash时生效】
which和whereis命令可用于查找可执行文件。区别在于which通过PATH环境变量查询,whereis通过索引数据库查询。
whereis查找的结果显然更加详细,其中第1条是ls命令所在的路径。第2,3条是手册页所在的路径。
本示例可以明显对比两者者的区别。
which通过PATH查找,因此只找到/usr/bin/python这一个程序。
而使用whereis可以找到所有的python程序
通常,type命令用于判断命令是否是内置命令。但它的参数提供了所搜路径的选型
简单使用
type -a 选项可以列出所有关于NAME参数名的信息。而 -p 选项列出命令的路径等同于使用which命令。
场景:日志文件生成规则一般是,大于某个预定值时,另外在生成一份文件。例如 20220101.log、20220101.log.1、20220101.log.2、 … 。
现在要得到一天中,某个时间段内产生的日志文件。这里可以利用find的基于时间的查询。
1.使用create_file.sh脚本模拟日志文件的生成。生成file1 ~ file15的文件。
2.现在我们查询file_6 ~ file_10 的文件。利用find基于时间的比较。
此命令查询到晚于file_6,同时早于file10生成/修改的文件。如果我们现在修改file_10文件,使其时间成为最晚的,那么执行此命令展示效果如下。