linux-shell-02 shell-脚本四剑客-find

linux-shell-02 shell-脚本四剑客-find

概念解析

  Linux的find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。

语法

1
2
3
4
5
find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;

-print :表示find命令将匹配的文件输出到标准输出中,默认执行该命令
-exec :表示find命令对匹配的文件执行该参数给出的shell命令。相应命令的形式为 cmd {} \;
-ok :它的作用和-exec一样,只是需要用户交互,更安全

其中,-exec 可以理解为承接命令。

其用法格式:

-exec [命令] {} \; 查找文件后跟-exec表示承接,后跟要操作的命令 {}:查找到的结果,\;反斜杠分号结尾。

例如:

1
2
3
find . -name "*.txt"	#查找当前目录下所有以.txt结尾的文件

find . -name "*.txt" -exec mv {} /document/ \; #查找当前目录下所有以.txt结尾的文件并移到/document目录下

参数说明

option参数说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
-name :按照文件名查找文件
-perm :按照权限查找文件
-prune :使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略
-user : 按照文件属主来查找文件
-group :按照文件数组来查找文件
-mtime -n +n :按照文件的更改时间来查找文件
-n :表示从此刻算起,文件的更改是在n天以内
+n :表示文件的更改时间是在n天以前
-atime -n +n : 按文件访问时间来查询
-ctime -n +n :按文件创建时间来查询
-nogroup :查找无有效属组的文件,即该文件所属的组在/etc/groups中不存在
-nouser ::查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在
-newer file1 ! file2 :查找更改时间比file1新但比file2旧的文件
-type
b:表示块设备文件 block
d:表示目录 directory
c:表示字符设备文件 char
p:表示管道文件 pipe
l:表示符号链接文件 link
f:表示普通文件 file
-depth :在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找
-fstype :表示查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息
-mount :表示在查找文件时不跨越文件系统的mount点
-follow :表示如果find命令遇到符号链接文件,就跟踪至链接所指向的文件
-cpio :表示对匹配的文件使用cpio命令,将这些文件备份至磁带设备中
-size n : 文件大小是n。单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。

举例分析

把原本在test1里面的三个txt文件转移到test2里面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost ~]# mkdir test1 test2
[root@localhost ~]#
[root@localhost ~]# cd test1
[root@localhost test1]# touch 1.txt 2.txt 3.txt
[root@localhost test1]# ls
1.txt 2.txt 3.txt
[root@localhost test1]# find . -name "*.txt" #查找当前目录下所有以.txt结尾的文件
./1.txt
./2.txt
./3.txt
[root@localhost test1]# find . -name "*.txt" -exec mv {} /root/test2/ \;
[root@localhost test1]# ls
[root@localhost test1]# cd /root/test2
[root@localhost test2]# ls
1.txt 2.txt 3.txt
[root@localhost test2]#

查找当前目录下大小等于0k的普通文件,并在删除之前询问它们:

1
2
3
4
5
6
7
8
9
[root@localhost test2]# ls
1.txt 2.txt 3.txt
[root@localhost test2]# find . -type f -size 0k -ok rm {} \;
< rm ... ./1.txt > ? y
< rm ... ./2.txt > ? y
< rm ... ./3.txt > ? n
[root@localhost test2]# ls
3.txt
[root@localhost test2]#

查找当前目录中,文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件:

说白了也就是查找664权限的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost test2]# ll
总用量 0
-rw-r--r--. 1 root root 0 4月 15 10:37 3.txt


#一开始是3.txt权限是644
[root@localhost test2]# find . -type f -perm 644 -exec ls -l {} \;
-rw-r--r--. 1 root root 0 4月 15 10:37 ./3.txt
[root@localhost test2]# find . -type f -perm 755 -exec ls -l {} \;
[root@localhost test2]#

#将3.txt权限改为755
[root@localhost test2]# chmod 755 3.txt
[root@localhost test2]# find . -type f -perm 755 -exec ls -l {} \;
-rwxr-xr-x. 1 root root 0 4月 15 10:37 ./3.txt
[root@localhost test2]# find . -type f -perm 644 -exec ls -l {} \;
[root@localhost test2]#

查找/root/test目录下以.txt结尾并且创建时间在1天以内的文件

1
2
3
4
[root@localhost test2]# cd
[root@localhost ~]# find /root/test2 -name "*.txt" -ctime -1
/root/test2/3.txt
[root@localhost ~]#

本篇到此结束

欢迎打赏,谢谢
------ 本文结束------
0%