linux 学习:查找命令 find | grep

作者: 苏丙榅
原文链接: 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.rhkb.cn/news/160404.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Eclipse】安装与卸载教程

目录 1.绿色版免安装版本 2.安装版本 3.卸载 首先打开官网&#xff1a;Eclipse Downloads | The Eclipse Foundation 选择download package 如图所示&#xff0c;到如下界面 1.绿色版免安装版本 按图片点击&#xff0c;即可开始下载 下载好后解压 &#xff0c;在桌面创建…

LeetCode24.两两交换链表中的节点

这道题还是比较简单&#xff0c;我看完题目的想法就是借助一个第三变量&#xff0c;来改变两个节点的指针的指向&#xff0c;比如我要改变1和2节点的指向&#xff0c;我用h1表示节点1&#xff0c;我创建一个新的节点ans&#xff0c;先拿ans指向节点2&#xff08;ans.next h1.n…

超简单小白攻略:如何利用黑群晖虚拟机和内网穿透实现公网访问

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

聚合支付的特点与应用建议

随着互联网技术的发展和繁荣&#xff0c;支付行业的发展如火如荼。目前已进入移动支付时代&#xff0c;支付手段和方式不断更新。2017年&#xff0c;建行、工行推出二维码支付&#xff0c;开展综合支付收单业务。 聚合支付具有灵活、方便、低成本、近市场的特点&#xff0c;符合…

HarmonyOS应用开发者基础认证【满分答案】

HarmonyOS应用开发者基础认证 一、判断题二、单选题三、多选题 一、判断题 在Column和Row容器组件中&#xff0c;justifyContent用于设置子组件在主轴方向上的对齐格式&#xff0c;alignItems用于设置子组件在交叉轴方向上的对齐格式。&#xff08;正确&#xff09; 所有使用C…

vue2 .sync 修饰符

vue2 .sync 修饰符 **创建 工程&#xff1a; H:\java_work\java_springboot\vue_study ctrl按住不放 右键 悬着 powershell H:\java_work\java_springboot\js_study\Vue2_3入门到实战-配套资料\01-随堂代码素材\day04\准备代码\13-sync修饰符 vue --version vue create v-sy…

Ubuntu 16.04 LTS third maintenance update release

Ubuntu 16.04 LTS (Xenial Xerus)今天迎来的第三个维护版本更新中&#xff0c;已经基于Linux Kernel 4.10内核&#xff0c;而且Mesa图形栈已经升级至17.0版本。Adam Conrad表示&#xff1a;“像此前LTS系列相似&#xff0c;16.04.3对那些使用更新硬件的用户带来了硬件优化。该版…

ios设备管理软件iMazing 2.17.11官方中文版新增功能介绍

iMazing 2.17.11官方中文版(ios设备管理软件)是一款管理苹果设备的软件&#xff0c; Windows 平台上的一款帮助用户管理 IOS 手机的应用程序&#xff0c;软件功能非常强大&#xff0c;界面简洁明晰、操作方便快捷&#xff0c;设计得非常人性化。iMazing官方版与苹果设备连接后&…

Leetcode hot 100之动态规划【递推公式】

目录 入门理解 斐波那契(Fibonacci&#xff09;数列&#xff1a;递归 数塔&#xff1a;递推 递推公式 最小路径和 遍历顺序 整数拆分&#xff1a;拆分为和&#xff0c;乘积最大化 背包&#xff1a;&#xff1a; ->装包 框架 01背包&#xff1a;不可复选 倒序遍历 …

Ubuntu系统下配置安装区块链Hyperledger Fabric(新手小白篇)

有些安装过程比较简单的&#xff0c;不会详细赘述。主要还是集中在Hyperledger Fabric的配置上。 本篇主要介绍在Ubuntu系统上安装Hyperledger Fabric的过程。这里使用的Ubuntu&#xff1a;16.04 LTS。 1. Git安装 Git工具安装命令如下&#xff1a; sudo apt update sudo ap…

如何提高敏捷迭代效率?sprint backlog

​敏捷开发的核心就是小步快跑&#xff0c;快速迭代。过去&#xff0c;企业开发的需求是完整的、清晰的、固定的&#xff0c;产品定义也是稳定的&#xff0c;因此企业在项目开发中经常采用自上而下、相互衔接且固定次序的瀑布开发模式。而在当今&#xff0c;中国互联网快速发展…

Stm32_标准库_14_串口蓝牙模块_解决手机与蓝牙模块数据传输的不完整性

由手机向蓝牙模块传输时间信息&#xff0c;Stm32获取信息并将已存在信息修改为传入信息 测试代码&#xff1a; #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h" #include "Serial.h"uint16_t num…

计算机操作系统-第九天

1、虚拟机 传统计算机的特点&#xff1a;一台物理机器只能运行一个操作系统 虚拟机的特点&#xff1a; 使用虚拟化技术&#xff0c;将一台物理机器虚拟化为多台虚拟机器&#xff08;Virtual Machine&#xff0c;简称VM&#xff09;每个虚拟机都可以独立运行一个操作系统 虚拟…

生物标志物发现中的无偏数据分析策略

目录 0. 导论基本概念 1. 生物标志物发现的注意事项2. 数据预处理2.1 高质量原始数据和缺失值处理2.2 数据过滤2.3 数据归一化 3. 数据质量评估3.1 混杂因素3.2 类别分离3.3 功效分析3.4 批次效应 4. 生物标志物发现4.1 策略4.2 数据分析工具4.3 模型优化策略 0. 导论 组学技术…

CSS复习笔记

CSS 文章目录 CSS1.概念2.CSS 引入方式3.选择器基础选择器:标签选择器类选择器id 选择器通配符选择器 复合选择器:**后代选择器****子代选择器****并集选择器****交集选择器-了解****伪类选择器** 结构伪类选择器&#xff1a;**:nth-child&#xff08;公式&#xff09;**伪元素…

人工智能应该怎么学?

人工智能这个词炙手可热&#xff0c;为了跟上时代的步伐&#xff0c;有许多小伙伴就想学习人工智能&#xff0c;今天来介绍一下人工智能究竟是什么&#xff1f;应该怎么学&#xff1f;怎么入门&#xff1f; 首先来看一下什么是人工智能&#xff1f; 人工智能 人工智能 人工智能…

PostMan使用csv/json进行数据参数化

创建csv文件 或者创建json文件 [{"name": "zhangsan","age": 18},{"name": "lisi","age": 20} ] 运行集合脚本的时候选择data文件 在请求接口中输入全局变量 {{user}}的方式进行传递 在Tests中要使用断言&…

亚马逊测评安全吗?

测评可以说是卖家非常宝贵的财富&#xff0c;通过测评和广告相结合&#xff0c;可以快速有效的提升店铺的产品销量&#xff0c;提高转化&#xff0c;提升listing权重&#xff0c;但现在很多卖家找真人测评补单后店铺出现问题导致大家对测评的安全性感到担忧&#xff0c;因为真人…

大家这么喜欢这件羽绒服的吗?眼光太好啦

简单干净散发着朝气&#xff0c;温暖的气息由内而外 90白鸭绒&#xff0c;高密度充绒量和蓬松度 三防工艺&#xff0c;立领连帽设计 下摆抽绳&#xff0c;帽子上的魔术贴设计 无一不将保暖落实在实处

HSN:微调预训练ViT用于目标检测和语义分割,华南理工和阿里巴巴联合提出

今天跟大家分享华南理工大学和阿里巴巴联合提出的将ViT模型用于下游任务的高效微调方法HSN&#xff0c;该方法在迁移学习、目标检测、实例分割、语义分割等多个下游任务中表现优秀&#xff0c;性能接近甚至在某些任务上超越全参数微调。 论文标题&#xff1a;Hierarchical Side…