一、概念
在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文件。