linux 学习:查找命令 find | grep

news2024/11/24 12:31:32

作者: 苏丙榅
原文链接: https://subingwen.cn/linux/commpress/

在使用Linux系统的时候, 我们经常会需要查找某些文件,但是大多数情况下我们并不能确定这些文件的具体位置,这样的话就非常浪费我们的时间。Linux为我们提供了很多的用于文件搜索的命令, 如果需求比较简单可以使用 locatewhichwhereis 来完成搜索, 如果需求复杂可以使用 find, grep进行搜索

1. find

find是Linux中一个搜索功能非常强大的工具, 它的主要功能是根据文件的属性, 查找对应的磁盘文件, 比如说我们常用的一些属性 文件名, 文件类型, 文件大小, 文件的目录深度 等, 下面基于这些常用数据来讲解一些具体的使用方法。

如果想用通过属性对文件进行搜索, 只需要指定出属性对应的参数就可以了, 下面将依次进行介绍。

1.1 文件名 (-name)

根据文件名进行搜索有两种方式: 精确查询模糊查询。关于模糊查询必须要使用对应的通配符,最常用的有两个, 分别为 * ?。其中 * 可以匹配零个或者多个字符, ?用于匹配单个字符。

如果我们进行模糊查询,建议(非必须)将带有通配符的文件名写到引号中(单引号或者双引号都可以),这样可以避免搜索命令执行失败(如果不加引号,某些情况下会这样)。

如果需要根据文件名进行搜索, 需要使用参数 -name

语法
# 语法格式: 根据文件名搜索 
$ find 搜索的路径 -name 要搜索的文件名
举例
# 模式搜索
# 搜索 root 家目录下文件后缀为 txt 的文件
[root@VM-8-14-centos ~]# find /root -name "*.txt"
/root/luffy/get/onepiece/haha.txt
/root/luffy/get/onepiece/onepiece.txt
/root/luffy/get/onepiece.txt
/root/luffy/get/link.txt
/root/luffy/robin.txt
/root/luffy/onepiece.txt
/root/ace/brother/finally/die.txt
/root/onepiece.txt

##################################################

# 精确搜索
# 搜索 root 家目录下文件名为 onepiece.txt 的文件
[root@VM-8-14-centos ~]# find /root -name "onepiece.txt"
/root/luffy/get/onepiece/onepiece.txt
/root/luffy/get/onepiece.txt
/root/luffy/onepiece.txt
/root/onepiece.txt

1.2 文件类型 (-type)

在Linux中有7中文件类型如下图所示, 如果有去求我们可以通过find对指定类型的文件进行搜索, 该属性对应的参数为 -type。其中每种类型都有对应的关键字,如下表:

在这里插入图片描述

语法
# 语法格式: 
$ find 搜索的路径 -type 文件类型
举例
# 搜索 root 用户家目录下, 软连接类型的文件
[root@VM-8-14-centos ~]# find /root -type l
/root/link.lnk
/root/luffy/get/link.lnk
/root/file/link

1.3 文件大小 (-size)

如果需要根据文件大小进行搜索, 需要使用参数 -size。关于文件大小的单位有很多,可以根据实际需求选择,常用的分别有 k(小写), M(大写), G(大写)。

在进行文件大小判断的时候,需要指定相应的范围,涉及的符号有两个分别为: 加号(+) 和 减号(-),下面具体说明其使用方法:

语法
# 语法格式: 
$ find 搜索的路径 -size [+|-]文件大小
  • 文件大小需要加单位:
    - k (小写)
    - M (大写)
    - G (大写)

关于文件大小的区间划分非常重要, 请仔细阅读, 并思考, 可以自己画个图, 这里以 4k来举例:

  • (1) -size 4k 表示的区间为 (4-1k,4k], 表示一个区间, 大于3k,小于等于4k
  • (2) -size -4k: 表示[0k, 4-1k], 表示一个区间, 大于等于0 并且 小于等于3k
  • (3)-size +4k: (4k, 正无穷), 表示搜索大于4k的文件
举例
# 搜索当前目录下 大于1M的所有文件 (file>3M)
$ find ./ -size +3M

# 搜索当前目录下 大于等于0M并且小于等于2M的文件 (0M <= file <=2M)
$ find ./ -size -3M

# 搜索当前目录下 大于2M并且小于等于3M的文件 (2M < file <=3M)
$ find ./ -size 3M

# 搜索当前目录下 大于1M 并且 小于等于 3M 的文件
$ find ./ -size +1M -size -4M

1.4 目录层级

因为Linux的目录是树状结构, 所有目录可能有很多层, 在搜索某些属性的时候可以指定只搜索某几层目录, 相关的参数有两个, 分别为: -maxdepth-mindepth

这两个参数不能单独使用, 必须和其他属性一起使用,也就是搜索某几层目录中满足条件的文件。

  • -maxdepth: 最多搜索到第多少层目录 ,
  • -mindepth: 至少从第多少层开始搜索

下面通过find搜索某几层目录中文件名满足条件的文件:

# 查找文件, 从根目录开始, 最多搜索5层, 这个文件叫做 *.txt (1 <= 层数 <= 5)
$ sudo find / -maxdepth 5 -name "*.txt"

# 查找文件, 从根目录开始, 至少从第5层开始搜索, 这个文件叫做 *.txt (层数>=5层)
$ sudo find / -mindepth 5 -name "*.txt"

注意: -maxdepth-mindepth需要在路径后面,并紧跟路径,其他位置是无效的。

1.5 同时执行多个操作

搜索文件的时候如果想在一个find后的文件中,对这些文件进一步执行其他操作, 通过使用管道(|)的方式是行不通的, 比如下面的操作:

# 比如: 通过find搜索最多两层目录中后缀为 .txt 的文件, 然后再查看这些满足条件的文件的详细信息
# 在find操作中直接通过管道操作多个指令, 最终输出的结果是有问题, 因此不能直接这样使用
$ find ./ -maxdepth 2  -name "*.txt" | ls -l
total 612
drwxr-xr-x 2 root root   4096 Jan 26 18:11 a
-rw-r--r-- 1 root root    269 Jan 26 17:44 a.c
drwxr-xr-x 3 root root   4096 Jan 26 18:39 ace
drwxr-xr-x 4 root root   4096 Jan 25 15:21 file
lrwxrwxrwx 1 root root     24 Jan 25 17:27 link.lnk -> /root/luffy/onepiece.txt
drwxr-xr-x 4 root root   4096 Jan 26 18:39 luffy
-r--r--r-- 1 root root     37 Jan 26 16:50 onepiece.txt
-rw-r--r-- 1 root root 598314 Dec  2 02:07 rarlinux-x64-6.0.0.tar.gz
  • 可以看到,并没有按要求列出对应文件,比如.c,.tar.gz a等文件都搜索出来了,明显与我们需求不符

如果想要实现上面的需求, 需要在find中使用 exec, ok, xargs, 这样就可以在find命令执行完毕之后, 再执行其他的子命令了。

1.5.1 exec
  • exec 是find的参数, 可以在exec参数后添加其他需要被执行的shell命令。

  • find 添加了 exec 参数之后, 命令的尾部需要加一个后缀 {} \;, 注意 {}\之间需要有一个空格。

  • 在参数-exec后添加的shell命令处理的是find搜索之后的结果, find的结果会作为 新添加的shell命令 的输入,最后在终端上输出最终的处理结果。

语法
# 语法:
$ find 路径 参数 参数值 -exec shell命令2 {} \;
举例1
# 搜索最多两层目录, 文件名后缀为 .txt的文件
$ find ./ -maxdepth 2  -name "*.txt" 
./luffy/robin.txt
./luffy/onepiece.txt
./onepiece.txt

# 搜索到满足条件的文件之后, 再继续查看文件的详细属性信息
$ find ./ -maxdepth 2  -name "*.txt" -exec ls -l {} \; 
-rw-r--r-- 1 root root 0 Jan 25 17:54 ./luffy/robin.txt
-r--r--r-- 2 root root 37 Jan 25 17:54 ./luffy/onepiece.txt
-r--r--r-- 1 root root 37 Jan 26 16:50 ./onepiece.txt
举例2

复制查找到的文件到令一个文件夹,对超过2万以上文件非常有效

find ./data0905/train/ -name "*.json" -exec cp  ./dataset202322/train/ {} \;

将查找到的所有文件,复制到./dataset202322/train/文件夹下。

1.5.2 ok

-ok-exec 都是find命令的参数, 使用方式类似, 但是这个参数是交互式的, 在处理find的结果的时候, 会向用户发起询问,比如在删除搜索结果的时候,为了保险起见,就需要询问机制了。

语法

语法格式如下:

# 语法: 其实就是将 -exec 替换为 -ok, 其他都不变
$ find 路径 参数 参数值 -ok shell命令2 {} \;
举例
# 搜索到了2个满足条件的文件
$ find ./ -maxdepth 1  -name "*.txt"
./aaaaa.txt 
./english.txt

# 查找并显示文件详细信息
$ find ./ -maxdepth 1  -name "*.txt" -ok ls -l {} \;     
< ls ... ./aaaaa.txt > ? y		# 同意显示文件详细信息
-rw-rw-r-- 1 robin robin 10 Apr 17 11:34 ./aaaaa.txt
< ls ... ./english.txt > ? n	# 不同意显示文件详细信息, 会跳过显示该条信息

# 什么时候需要交互呢? ---> 删除文件的时候
$ find ./ -maxdepth 1  -name "*.txt" -ok rm -rf {} \;     
< rm ... ./aaaaa.txt > ? y		# 同意删除
< rm ... ./english.txt > ? n	# 不同意删除

# 删除一个文件之后再次进行相同的搜索
$ find ./ -maxdepth 1  -name "*.txt"
./english.txt		# 只剩下了一个.txt 文件
1.5.3 xargs

在使用find的-exec参数的时候, 需要在指定的子命令尾部添加几个特殊字符{} \;,一不小心就容易写错,有一种看起来更加直观、书写更加简便的方式,我们可以使用 xargs替换掉-exec参数, 而且在处理数据的时候xargs更高效。有了xargs的加持我们就可以在find命令中直接使用管道完成前后命令的数据传递, 使用方法如下:

语法
# 在find 中 使用 xargs 关键字我们就可以使用管道了, 否则使用管道也不会起作用
# 将 find 搜索的结果通过管道传递给后边的shell命令继续处理
$ find 路径 参数 参数值 | xargs shell命令2
举例
# 查找文件
$ find ./ -maxdepth 1  -name "*.cpp" 
./occi.cpp
./main.cpp
./test.cpp

# 查找文件, 并且显示文件的详细信息
robin@OS:~$ find ./ -maxdepth 1  -name "*.cpp" | xargs ls -l
-rw-r--r-- 1 robin robin 2223 Mar  2  2020 ./main.cpp
-rw-r--r-- 1 robin robin 1406 Mar  2  2020 ./occi.cpp
-rw-r--r-- 1 robin robin 2015 Mar  1  2020 ./test.cpp

xargs的效率比使用 -exec 效率高

  • exec: 将find查询的结果逐条传递给后边的shell命令
  • xargs: 将find查询的结果一次性传递给后边的shell命令

2. grep

find不同 grep 命令用于查找文件里符合条件的字符串。grep命令中有几个常用参数, 下面介绍一下:

  • -r: 如果需要搜索目录中的文件内容, 需要进行递归操作, 必须指定该参数
  • -i: 对应要搜索的关键字, 忽略字符大小写的差别
  • -n: 在显示符合样式的那一行之前,标示出该行的列数编号

语法

# 语法格式: 
$ grep "搜索的内容" 搜索的路径/文件 参数

对应要搜索的文件内容, 建议放到引号中, 因为关键字中可能有特殊字符, 或者有空格, 从而导致解析错误。
关于引号, 单双都可以,可根据自己的需求选择。

举例

# 搜索指定文件a.c中是否有字符串 include
[root@VM-8-14-centos ~]# grep "include" a.c
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

# 不区分大小写进行搜索
[root@VM-8-14-centos ~]# grep "INCLUDE" a.c
[root@VM-8-14-centos ~]# grep "INCLUDE" a.c -i
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

# 搜索指定目录中哪些文件中包含字符串 include 并且显示关键字所在的行号
[root@VM-8-14-centos ~]# grep "include" ./ -rn        
./a.c:1:#include <stdio.h>
./a.c:2:#include <unistd.h>
./a.c:3:#include <fcntl.h>
./luffy/get/e.c:1:#include <stdio.h>
./luffy/get/e.c:2:#include <unistd.h>
./luffy/get/e.c:3:#include <fcntl.h>
./luffy/c.c:1:#include <stdio.h>
./luffy/c.c:2:#include <unistd.h>
./luffy/c.c:3:#include <fcntl.h>
./ace/b.c:1:#include <stdio.h>
./ace/b.c:2:#include <unistd.h>
./ace/b.c:3:#include <fcntl.h>
./.bash_history:1449:grep "include" ./
./.bash_history:1451:grep "include" ./ -r
./.bash_history:1465:grep "include" a.c

3. locate

我们可以将locate看作是一个简化版的find, 使用这个命令我们可以根据文件名搜索本地的磁盘文件, 但是locate的效率比find要高很多。原因在于它不搜索具体目录,而是搜索一个本地的数据库文件,这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库

# 使用管理员权限更新本地数据库文件, root用户这样做
$ updatedb
# 非root用户需要加 sudo
$ sudo updatedb

locate有一些常用参数, 使用之前先来介绍一下:

    1. 搜索所有目录下以某个关键字开头的文件
$ locate test		# 搜索所有目录下以 test 开头的文件
    1. 搜索指定目录下以某个关键字开头的文件, 指定的目录必须要使用绝对路径
$ locate /home/robin/test    # 指定搜索目录为 /home/robin/, 文件以 test 开头
    1. 搜索文件的时候, 忽略文件名的大小写, 使用参数 -i
$ locate TEST -i	# 文件名以小写的test为前缀的文件也能被搜索到
  • 4.列出前N个匹配到的文件名称或路径名称, 使用参数-n
$ locate test -n 5		# 搜索文件前缀为 test 的文件, 并且只显示5条信息
  • 5 基于正则表达式进行文件名匹配, 查找符合条件的文件, 使用参数 -r
# 使用该参数, 需要有正则表达式基础
$ locate -r "\.cpp$"		# 搜索以 .cpp 结尾的文件

正则表达式小科普:
在正则表达式中 .可以匹配任意一个 非 \n的单字符
上边的命令中使用转译字符\对特殊字符.转译, 就得到了普通的字符.
在正则表达式中 放到字符尾部 , 表示字符串必须以这个字符结尾 , 上边的命令中修饰的是字符 p 正则表达式中的字符 c 和后边的字符 p 需要进行字节匹配 , 没有特殊含义通过上面的解释就能明白 c ˙ p p 放到字符尾部, 表示字符串必须以这个字符结尾, 上边的命令中修饰的是字符p 正则表达式中的 字符c和后边的字符p需要进行字节匹配, 没有特殊含义 通过上面的解释就能明白 \.cpp 放到字符尾部,表示字符串必须以这个字符结尾,上边的命令中修饰的是字符p正则表达式中的字符c和后边的字符p需要进行字节匹配,没有特殊含义通过上面的解释就能明白c˙pp 说的就是以 .cpp结尾的字符串

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1098005.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

夜神模拟器安装教程

夜神模拟器是一款很好用的安卓模拟器&#xff0c;夜神模拟器最新版兼容性更强&#xff0c;稳定性也不错&#xff0c;简单操作使用便捷&#xff0c;可以有很好的游戏体验&#xff1a;运行完美 &#xff0c;酣畅淋漓&#xff0c;喜欢的小伙伴可以在本站下载使用&#xff0c;本期小…

binutils工具下载

一、下载binutils工具binutils-2.28.tar.bz2 https://ftp.gnu.org/gnu/binutils/ 二、解压 tar -xvjf binutils-2.28.tar.bz2三、建立build目录 在binutils-2.28下创建目录build 指定编译目录&#xff1a; ../configure --enable-debug --prefix/home/zhangchuang/ld/bin…

【TES720D-KIT】青翼自研基于复旦微FMQL20S400全国产化ARM开发套件(核心板+底板)

TES720D-KIT是专门针对我司TES720D&#xff08;基于复旦微FMQL20S400的全国产化ARM核心板&#xff09;的一套开发套件&#xff0c;它包含1个TES720D核心板&#xff0c;加上一个TES720D-EXT扩展底板。 FMQL20S400是复旦微电子研制的全可编程融合芯片&#xff0c;在单芯片内集成…

SycoTec 4061主轴维修:主轴检测与维修过程记录

主轴是机器中关键的部件之一&#xff0c;其主要作用是传递动力并驱动机器运转。由于长期使用或其它因素&#xff0c;主轴可能会出现磨损、弯曲、变形等问题&#xff0c;这些问题都会影响机器的正常运转和精度。因此&#xff0c;对主轴进行及时维修和保养对于保证机器的正常运转…

【视觉算法系列1】使用 KerasCV YOLOv8 进行红绿灯检测(上)

提示&#xff1a;免费获取本文涉及的完整代码与数据集&#xff0c;请联系助理老师 peaeci122 使用最新“KerasCV YOLOv8”模型进行红绿灯检测的综合指南 YOLO目标检测模型已经进入了无数的应用领域&#xff0c;从监控系统到自动驾驶汽车。那么&#xff0c;如果在KerasCV框架下…

01背包(一) 01背包(二)动态规划

01背包&#xff08;一&#xff09; 二维数组 题目 背包最大重量为4。 物品为&#xff1a; 重量价值物品0115物品1320物品2430 问背包能背的物品最大价值是多少&#xff1f; 创建二维数组&#xff0c;dp[i][j]的含义是任意放入前 i 个物品放进在背包重量为j的时候的最大价值…

openssl生成SM2公私钥对命令详解

&#xff08;1&#xff09;获得openssl支持椭圆曲线算法列表 命令&#xff1a;openssl ecparam -list_curves 返回结果&#xff1a; secp112r1 : SECG/WTLS curve over a 112 bit prime field secp112r2 : SECG curve over a 112 bit prime field secp128r1 : SE…

051:mapboxGL改变bearing和pitch,变换查看视角

第051个 点击查看专栏目录 本示例是介绍演示如何在vue+mapbox中改变bearing和pitch,变换查看视角。bearing:地图的默认方位角(可选,表示 地图视口正上方中心点 在地图上 北偏东 的角度。默认值为 0)。pitch:地图的默认倾斜角度(可选,默认值为 0,范围为 0 ~ 85)。 直…

《持续交付:发布可靠软件的系统方法》- 读书笔记(四)

持续交付&#xff1a;发布可靠软件的系统方法&#xff08;四&#xff09; 第 4 章 测试策略的实现4.1 引言4.2 测试的分类4.2.1 业务导向且支持开发过程的测试4.2.2 技术导向且支持开发过程的测试4.2.3 业务导向且评价项目的测试4.2.4 技术导向且评价项目的测试4.2.5 测试替身 …

如何获取跑腿App源码并定制化你的业务

跑腿App源码是开发送货和快递服务平台的理想起点。它为你提供了一个现成的应用程序框架&#xff0c;可以帮助你快速进入这个竞争激烈的市场。本文将指导你如何获取跑腿App源码&#xff0c;以及如何将其定制化以适应你的业务需求。我们将以一个示例项目为基础进行说明。 步骤1…

故障维修无忧服务:OLED透明拼接屏的专业技术支持与保修服务

OLED透明拼接屏作为未来显示技术的领军者&#xff0c;以其卓越的画质和全方位的优势在市场上备受推崇。 本文将深入探讨OLED透明拼接屏的画质特点和独有的优势&#xff0c;并为您提供选购指南、价格表以及故障维修服务&#xff0c;助您了解并选择最适合的OLED透明拼接屏。 一、…

软考-系统开发基础

软件开发模型 瀑布模型 瀑布模型的优点是&#xff1a;容易理解&#xff0c;管理成本低&#xff1b;签掉开发阶段早期计划及需求调查和产品测试 V模型 V模型是瀑布模型的一个变体 注重测试&#xff0c;但测试放在编码之后 喷泉模型 原型模型 螺旋模型 综合了瀑布模型和原型模…

蔬菜水果生鲜配送团购商城小程序的作用是什么

蔬菜水果是人们生活所需品&#xff0c;从业者众多&#xff0c;无论小摊贩还是超市商场都有不少人每天光临&#xff0c;当然这些只是自然流量&#xff0c;在实际经营中&#xff0c;蔬菜水果商家还是面临着一些难题。 对蔬菜水果商家而言&#xff0c;线下门店是重要的&#xff0…

ubuntu 20.04 使用systemback自定义系统镜像和系统备份

ubuntu 20.04 使用systemback自定义系统镜像和系统备份 Systemback简介1. 安装 systemback16.0418.04 查看 2. 使用 systemback创建自定义镜像制作镜像制作中制作完成将镜像写入U盘 Systemback简介 Systemback是一个简单的系统备份和恢复应用程序&#xff0c;根据GPLv3许可条款…

2023年中国自动驾驶卡车市场发展趋势分析:自动驾驶渗透率快速增长[图]

自动驾驶卡车的技术原理是通过电脑算法控制车辆行驶&#xff0c;辅助驾驶员完成任务。其实现方式主要是基于传感器和计算处理技术。自动驾驶卡车可以随时感知周围环境&#xff0c;灵活避障&#xff0c;自适应调整行驶路径&#xff0c;相比之下传统卡车需要驾驶员进行手动操作&a…

2023最新闪聊远程获取通讯录PHP源码/附安装教程/php即时聊天源码/获取闪聊通讯录源码

源码介绍&#xff1a; 闪聊远程获取通讯录PHP&#xff0c;首先你需要在服务器上搭建Nginxmysql5.6php5.6phpMyAdmin的环境。接着&#xff0c;在app/database.php中配置好数据库路径。最后&#xff0c;在宝塔面板的站点管理中&#xff0c;将伪静态设置为tphinkphp即可。这样一来…

免费office安装工具箱(可安装任意版本)

Office Tool Plus v10.0.5.2 -office安装工具箱 Office Tool Plus是一款相当好用的office安装工具&#xff0c;并且安装完了顺带激活。借助Office Tool Plus&#xff0c;可以一次性安装Office、Visio、Project&#xff0c;还可以选择不同的授权版本。自定义选择Office的组件&a…

QCustomPlot实现曲线拖拽

本文内容目录 需求场景:一、选择控件二、将QCustomPlot库整合到你的Qt项目中1、下载源代码2、创建.pri三、鼠标框选,实现坐标缩放四、曲线拖动1、定位曲线2、移动时改变曲线五、问题的产生与解决1、查看源码2、修改本项目代码需求场景: 曲线图应该同时具有以下功能点: 1、…

聊一聊翻页电子书制作流程

翻页电子书由于比传统纸质书更加方便阅读&#xff0c;又非常利用储存&#xff0c;所以受到了很多人的喜爱。如何制作翻页电子书&#xff1f;今天我们简单聊一聊翻页电子书制作流程。 制作翻页电子书首先我们要有一个好用的工具&#xff0c;比如我们可以借用Flbook在线翻页电子…

vant_ CountDown倒计时

语法可以直接在官网查看 需求 后端返回的数据格式如下 [{"id": 1,"btn_text": "1","second": 0},{"id": 2,"btn_text": "1","second": 0}... ]之前约定second最多30s&#xff0c; 因此只需…