编程语言
329
当查找的需求比较简单时可以使用 locate which whereis 复杂时可以使用find和grep
对应要搜索的文件内容, 建议放到引号中, 因为关键字中可能有特殊字符, 或者有空格, 从而导致解析错误。 关于引号, 单双都可以
1.find
find 的功能非常强大,可根据文件属性进行查找
①文件名(-name)
#根据文件名搜索的语法 find 搜索路径 -name 要搜索的文件名 ##可以使用模糊搜索(*,?)这些模糊搜索关键字
#eg:搜索 root 家目录下文件后缀为txt的文件 find /root -name "*.txt"
②文件类型(-type)
#语法格式 find 搜索路径 -type 文件类型
文件类型 | 类型的字符描述 |
---|---|
普通文件类型 | f |
目录类型 | d |
软连接类型 | l |
字符设备类型 | c |
块设备类型 | b |
管道类型 | p |
本地套接字类型 | s |
#eg:root目录下软链接类型的文件 find /root -type l
③文件大小(-size)
#语法格式 find 搜索路径 -size [ +|- ] 文件大小 #文件大小需要加单位 #-k(小写) #-M #-G
文件大小区间非常重要 1.-size 4k : 表示的区间为(3k,4k] 2.-size -4k : 表示的区间为(0k,3k] 3.-size -4k : 表示的区间为(4k,无穷)
#eg:搜索当前目录下大于1M且小于等于3M的文件 find ./ -size +1M -size -3M
④目录层级
由于Linux目录是树形,所以目录可能有很多层
#语法格式 find 搜索路径 -maxdepth n 搜索属性 属性参数 #搜索最多n层 find 搜索路径 -mindepth n 搜索属性 属性参数 #搜索最少n层
这两个参数不能单独使用,必须和其他属性一起使用
#eg:从根目录开始搜索,最多5层,文件后缀为.txt sudo find / -maxdepth 5 -name "*.txt"
⑤同时执行多个操作
5.1: -exec
-exec 是find的参数, 可以在exec参数后添加其他需要被执行的shell命令。
#语法格式 find 路径 参数 参数值 -exec shell命令 {} \; #结尾要加上{} \; 且{} \之间有空格
#eg: 搜索最多两层目录,以 .txt结尾的文件,并查看文件信息 find ./ -maxdepth 2 -name "*.txt" -exec ls -l {} \;
5.2: -ok
加入 -ok 执行shell时会向用户发起询问,比如在删除搜索结果的时候
#语法格式 find 路径 参数 参数值 -ok shell命令 {} \;
#eg: find ./ -maxdepth 1 -name "*.txt" -ok ls -l {} \; ##之后同意显示文件信息,同理删除时询问是否删除
5.3: xargs
xargs 参数不同于 -exec和-ok 需要在结尾加符号,有着更直观简便的写法 并且在处理数据时 xargs更高效 -exec: 将find查询的结果逐条传递给后边的shell命令 xargs: 将find查询的结果一次性传递给后边的shell命令
#语法格式 find 路径 参数 参数值 | xargs shell命令
#eg:查找文件并显示信息 find ./ -maxdepth 1 -name "*.cpp" | xargs ls -l
2.grep
#语法格式 grep "搜索内容" 搜索的路径/文件 参数 # 参数: -r :搜索目录中的文件内容时,必须加上-r # -i :忽略大小写 # -n :显示符合搜索结果那一行之前显示行号
#eg:搜索指定目录中哪些文件中包含字符串 include 并且显示关键字所在的行号 grep "include" ./ -rn
3.locate
locate可看作是一个简化版的find, 但是locate的效率比find要高很多。 原因在于它不搜索具体目录,而是搜索一个本地的数据库文件,这个数据库中含有本地所有文件信息。 Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动的文件。 为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
#先进行数据库更新 sudo update #语法格式 locate xxx #搜索所有目录下以 xxx 开头的文件 locate /home/sewerperson/xxx #指定搜索目录下以 xxx 开头的文件 locate XxX -i #-i 忽略搜索文件名的大小写(以xxx开头的文件也能搜索出来) locate xxx -n 5 #搜索前缀为xxx的文件,并且只显示前5个匹配到的 locate -r "\.cpp$" #-r 表示可以使用正则表达式 (以.cpp结尾的文件)
关于正则表达式
在正则表达式中 .可以匹配任意一个 非 \n的单字符 上边的命令中使用转译字符\对特殊字符.转译, 就得到了普通的字符. 在正则表达式中 $放到字符尾部, 表示字符串必须以这个字符结尾, 上边的命令中修饰的是字符p 正则表达式中的 字符c和后边的字符p需要进行字节匹配, 没有特殊含义 通过上面的解释 \.cpp$ 说的就是以 .cpp结尾的字符串