find 的使用以及和args grep结合使用的原理

一、概念

在linux目录下,当需要找某个文件或者目录时使用,文件和目录都可以查找。

find命令常用来搜索目录树中的文件或者目录,并可对搜索出来的目录或文件执行某些操作。 
命令格式:find pathname -options [-print -exec -ok…],其中pathname表示在pathname这个目录下寻找。 
-options表示find命令的常用选项,主要有 
(1)、-name 表明按文件或目录名来进行查找; 
(2)、-type 表明将按文件类型来查找; 
(3)、-perm 表明将按文件或目录权限来查找; 
(4)、-user 表明将文件或目录的所有者查找; 
(5)、-group 表明将按文件或目录所属的组来查找; 
(6)、-mtime -n (或+n) 表明按照文件的更改时间来查找文件, 时间都是距离此刻的时间,- n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。
2、-print表示将find命令匹配的文件输出到标准输出,实际上用的时候加与不加都是标准输出。 
3、-exec和-ok是一样的含义,都是将find命令匹配到的文件或目录执行-exec 后面接的linux命令。只是-ok以更安全的方式在执行-ok后面接的命令,在执行这些命令前都要对用户进行询问。-exec选项的命令形式:command {} \ 注意{}和\之间有空格。 
例:find ./ -name “*ff.json” -exec rm -f {} \; 
查找当前目录及其子目录中的.cpp文件,并将其删除。其中{}表示find的结果。 

二、举例

首先创建若干文件:touch xx.json:

1、使用find 查找文件名中包含aa的json文件,-print的作用

可以看到,

find ./ -name "*aa*" 与 find ./ -name "*aa*" -print的结果是一样的,都是直接打印匹配文件的目录结构。

find ./ -name "*aa*" -ls 与 find ./ -name "*aa*" -print -ls的区别在于,前者直接打印文件信息,后者多打印了文件的目录结构

2、-exec 和 -ok的区别

可以发现,

-exec直接执行,后面的ls -l指令,而-ok则是进行询问,当用户输入y时,执行ls -l指令。

3、换一个指令试试,比如rm

可以发现,

aa.json文件已经被删除。

4、find、args以及grep的结合使用

grep :当想知道某个关键字xxx在那些文件里面的那些行出现的时候,用这个命令。这个命令可以配合正则表达式实现强大的功能。 通常用法:grep -nr xxx ./ 在当前目录及其子目录下搜索xxx关键字(递归搜索是-r的作用),并在匹配行号后面显示行号(显示行号是-n的作用)。 这样简单的命令基本满足日常linux系统使用的基本需求。但是还是在一些场景下需要更复杂一点的命令。比如grep -nr xxx ./ 命令会对当前目录及其子目录下面的所有文件进行匹配,很多情况下二进制文件也会出现在结果中,导致每次查找都很耗时,降低了使用该命令的欲望。find、xargs、grep配合使用可以提高一些效率。

find命令的结果是一个标准输出,这里的标准输出可以认为就是输出一串字符串。利用管道将这个标准输出作为输入传递给grep命令,当然grep会在一串字符串里面进行筛选。 

xargs命令是给其他命令传递参数的一个过滤器,常作为组合多个命令的一个工具。它主要用于将标准输入数据转换成命令行参数,xargs能够处理管道或者标准输入并将其转换成特定命令的命令参数。也就是说find的结果经过xargs后,其实将find找出来的文件名逐个作为了grep的参数。grep再在这些文件内容中查找关键字test。 

假如,我们刚刚演示的的文件夹中有超级多的文件以及文件夹,此时,我们想找到某个文件中包含某个字符创的那一行数据,

1)我们在演示的文件夹中,再创建一个文件夹test,里面创建一个aa.json的文件

2)我们在aa.json文件中以及/test/aa.json文件中输入数据

文件夹下内容:

a.json:

/test/aa.json:

3)执行命令:

可以发现,

xargs会将管道命令符|前面的内容,当做参数传入后面的命令,这样grep找的就是参数代表的文件,就是到aa.json中找了,

而没有args的话,会将|前面的输出内容,也就是那4个文件名,,

因此find . -name "aa*" |  grep  hello  找不到文件名包含hello的,因此输出为空,

find . -name "aa*" |  grep  aa 则打印了那四个包好aa的文件;

find . -name "aa*" | xargs grep  么 -ls   则输出的是文件内容包含“么”的两个文件:aa.json 和 /test/aa.json,

find . -name "aa*" | xargs grep hello  -ls 则输出的是文件内容 包含“hello”的aa.json文件。

猜你喜欢

转载自blog.csdn.net/qq_36898043/article/details/81367221
今日推荐