目录
1.什么是find指令
Linux find 命令用来在指定目录下查找文件。 任何位于参数之前的字符串都被识别匹配查找的文件或者目录名。 如果使用该命令时,不设置任何参数,则 find 命令将在当前目录下查找子目录与文件。 并且将查找到的子目录和文件全部进行显示。
命令:find [path] [expression]
path 是要查找的目录路径,可以是一个目录或文件名,也可以是多个路径,多个路径之间用空格分隔,如果未指定路径,则默认为当前目录。
expression 是可选参数,用于指定查找的条件,可以是文件名、文件类型、文件大小等等。
代码如下(示例):
我们先随便创建一些文件和目录
[root@localhost opt]# touch {1..5}.txt
[root@localhost opt]# ls
1.txt 2.txt 3.txt 4.txt 5.txt
[root@localhost opt]# mkdir -p 11/22/33
[root@localhost opt]# ls
11 1.txt 2.txt 3.txt 4.txt 5.txt
命令:find
[root@localhost opt]# find
.
./1.txt
./2.txt
./3.txt
./4.txt
./5.txt
./11
./11/22
./11/22/33
我们看到现在所在目录下的所有文件目录和子目录文件全部显示出来
这里是find后面不输入任何命令和参数的作用
作用就是查找目前所在目录下的所有文件目录(包括子目录和文件)
2.find拓展命令
我们上面写到了,find后面是可以跟随系统命令进行组合使用,后面配合不同的命令也会有不同的效果,在日常工作学习中,这些都是我们运维人员必须掌握并且熟悉运用的命令。
-name 根据文件目录名称去进行匹配查找,允许使用?和*通配符进行匹配查找,记得后面输入类似于"?.txt"的文件名时,一定要用双引号或单引号。
代码如下(示例):
[root@localhost opt]# find -name '?.txt'
./1.txt
./2.txt
./3.txt
./4.txt
./5.txt
这时便将单字符开头的txt后缀文件全部筛选了出来
注意事项:后面可以跟文件全名,此时双引号和单引号可有可无
如果是跟通配符去匹配文件,一定要加上双引号或者单引号进行匹配
-size 根据目标文件大小进行查找,后面可跟 + 或者 - ,符号分别代表,大于,小于等于,如果大小前面没有 + 也没有 - 则代表等于,后面内存表达分别有“k” “M” “G” “c”,经常用到的分别是“k” “M” “G”
代码如下(示例):
[root@localhost opt]# find -size -5M
.
./1.txt
./2.txt
./3.txt
./4.txt
./5.txt
./11
./11/22
./11/22/33
我们看到所有文件和目录包括子目录和文件都被查找了出来
注意事项:后面的内存代表,一定要区分大小写,不然一定会报错。
-user 根据目标文件是否属于目标用户进行查找
[root@localhost opt]# find -user root
.
./1.txt
./2.txt
./3.txt
./4.txt
./5.txt
./11
./11/22
./11/22/33
我们看到这些文件同时被筛选了出来,因为这些都此用户下的文件和目录。
这个在正常的工作中并不常用,在这就不进行太详细的演示了
-type 根据目标文件类型进行查找,f 代表正常普通文件,d 代表目录,l 代表符号连接文件
代码如下(示例):
[root@localhost opt]# find -type d
.
./11
./11/22
./11/22/33
[root@localhost opt]# find -type f
./1.txt
./2.txt
./3.txt
./4.txt
./5.txt
我们看到查找目录时,包括其目录下的子目录子文件都会被筛选出来
注意事项:-type 后面跟的文件类型不需要加 - 和 / 类的符号
3.组合拓展命令
find -name xxx -a -type f
查找某个名称的文件并且是普通文件
find -name xxx -o -type f
查找某个名称的文件或是普通的文件
中间的-a也可以换成-o,但是结果大不一样
-a 代表and,前后两个条件都需要满足
-o 代表or,前后两个条件满足一个即可
代码如下(示例):
[root@localhost opt]# ls -i
1840028 11 101394029 2 103100994 3.txt 103100996 5.txt
101394029 1.txt 101394030 2.txt 103100995 4.txt
[root@localhost opt]# find -name '?.txt' -a -type f
./1.txt
./2.txt
./3.txt
./4.txt
./5.txt
./11/1.txt
我们看到这时既满足 txt 后椎的文件又满足普通文件条件的文件都被筛选了出来,但是没有后缀的硬链接文件并没有被筛选出来,因为此文件并没有后缀 txt,即使文件在目录里,也会被筛选出来,此目录下的所有文件都会被展示出来。
[root@localhost opt]# ls -i
1840028 11 101394029 2 103100994 3.txt 103100996 5.txt
101394029 1.txt 101394030 2.txt 103100995 4.txt
[root@localhost opt]# find -name '?.txt' -o -type f
./1.txt
./2.txt
./3.txt
./4.txt
./5.txt
./11/1.txt
./2
我们能看到,结果筛选出来的文件完全不一样,第二个我们看到之前创建的硬链接文件并不属于前面的 txt 后缀文件,但是属于后面的普通文件,满足了其中一个条件就会被筛选出来
同理,把 -name -type -size -user 四种结合相互使用也是可以精准查找相匹配的文件,但是一定要注意中间的 -a 和 -o 的使用。
接下来是另外一种拓展命令的使用方法
命令:-exec 系统命令 { } \;
这个命令需要与find和拓展指令结合使用,是指无需用户确认,强制执行后面的系统命令,大括号代表的是前面命令的结果当做后面exec的参数
命令:find -name ‘?.txt’ -exec rm -rf { } \;
代码如下(示例):
[root@localhost opt]# ls
11 1.txt 2 2.txt 3.txt 4.txt 5.txt
[root@localhost opt]# find -name '?.txt' -exec rm -rf {} \;
[root@localhost opt]# ls
11 2
rm -rf 的命令是删除,-exec 前面的命令执行的结果,作为参数放到 -exec 的命令中的{ }位置执行,这时我们看到后缀名称带 txt 的文件都被删除掉了,结尾的 \ ; 是这条命令的固定格式,必须以这个结尾
这时我们可以和之前结合的拓展find命令,再次结合使用,进行进一步详细的筛选和操作
命令:find -name '?.txt' -a -type f -exec rm -rf {} \;
查找名字带后缀 txt 的普通文件并把它删除
代码如下(示例):
[root@localhost opt]# ls
11 1.txt 2.txt 3.txt 4.txt 5.txt
[root@localhost opt]# find -name '?.txt' -a -type f -exec rm -rf {} \;
[root@localhost opt]# ls
11
我们看到这时前面被 find 指令所筛选出来的文件,被 -exec 指令强制删除了
只剩下一个11的目录,它既不是普通文件,也不是后缀带 txt 的文件,所以筛选不到