SHELL脚本攻略(学习笔记)--2.4 find

时间:2023-03-09 01:46:06
SHELL脚本攻略(学习笔记)--2.4 find

转载请注明出处:http://www.cnblogs.com/f-ck-need-u/p/5916657.html

 

超级强大的find命令。

find搜索是从磁盘搜索,而不是从数据库搜索。

2.4.1 最基础的打印操作

find命令默认接的命令是-print,它默认以\n分隔每个找到的。可以使用-print0来使用\0分隔,这样就不分行了。

/tmp/tmp/b      ç这个和下面的全是第一层的

/tmp/tmp/.x

/tmp/tmp/c

/tmp/tmp/a

[root@xuexi tmp]# find /tmp/tmp -mindepth 2

/tmp/tmp/b/2.log

/tmp/tmp/b/1.log

/tmp/tmp/b/3.log

/tmp/tmp/c/2.sh

/tmp/tmp/c/3.sh

/tmp/tmp/c/1.sh

2.4.2.11 根据文件类型搜索:-type

有以下几种类型:常用的标红了。

b 块设备block (buffered) special

c 字符设备character (unbuffered) special

d 目录directory

p 管道文件named pipe (FIFO)

f 普通文件regular file

l 符号链接symbolic link;

s 套接字socket

[root@xuexi tmp]# find /tmp -type d

/tmp

/tmp/lost+found

/tmp/b

/tmp/d

/tmp/vmware-root

/tmp/tmp

/tmp/tmp/b

/tmp/tmp/c

/tmp/a

/tmp/.ICE-unix

2.4.2.12 根据文件大小搜索:-size

-size +30M表示搜索大于30M的文件或目录,-size 30M表示搜索30M的文件或目录,-size -30M表示小于30M的文件和目录。

除了M,还有

‘b’ 块(512字节,不写单位时默认为块)【for 512-byte blocks (this is the default if no suffix is used)】

‘c’ 字节【for bytes】

‘w’ 两字节的单词,我也不知道这是什么鬼【for two-byte words】

‘k’ KB【for Kilobytes (units of 1024 bytes)】

‘M’ MB【for Megabytes (units of 1048576 bytes)】

‘G’ GB【for Gigabytes (units of 1073741824 bytes)】

搜索所有大于30M的文件。由于有些文件无法访问,所以将错误记录丢黑洞去。

[root@xuexi tmp]# find / -type  f -size +30M 2>/dev/null

/var/lib/rpm/Packages

/usr/lib64/libgcj.so.10.0.0

/usr/lib/locale/locale-archive

/sys/devices/pci0000:00/0000:00:0f.0/resource1

/sys/devices/pci0000:00/0000:00:0f.0/resource1_wc

2.4.2.13 根据文件时间和新旧搜索:-atime(-amin)、-ctime(-cmin)、-mtime(0mmin)、-newer

以天为单位计数的:

-atime:(access time)最后一次访问时间。

-mtime:(modify time)最后一次修改时间。增删改目录里的文件也会modify目录。

-ctime:(change time)元数据最后一次状态改变的时间,包括权限和所有权。

单位是天,但是是根据小时来计算的,即24*n(n可以是小数),2天前就查找距离现在48小时前的。

忽略小数部分。例如,查找前第3天的文件,3*24=72,3.1*24=72,…3.9*24=24,4*24=96,那么72-95.99999小时的都属于这一天的,96小时以后的是3天以前的,即+3,这已经是前第四天了。

 

SHELL脚本攻略(学习笔记)--2.4 find

以分钟为单位计数的:-amin、-mmin、-cmin。

还有一个选项,比较新旧:-newer。这个新旧比较的是modify time,即-mtime。

[root@xuexi tmp]# find /tmp/tmp -newer a

/tmp/tmp

/tmp/tmp/d.txt

注意:没有-older选项。

2.4.2.14 根据权限或所有者搜索:-perm、-user、-group

-perm根据权限搜索,同样有“+mode”、“-mode”和正好等于mode的权限,还有/mode格式,且建议使用/mode格式替代“+mode”,因为man find pages说的。

Ø  -perm mode:正好等于mode权限的。

如0766,搜索权限正好是0766的所有文件。

Ø  -perm /mode或+mode:指包含权限,搜索包含mode中的任意一权限位的权限文件,可以包含所有者权限,所属组权限和其他*限。

如+0766,则0700也会被搜索出来,因为包含了所有者的7权限,同理6也是一样的。

Ø  -perm -mode:指搜索比mode权限更大更严格的的文件。

如-0766,则只能搜索出0776、0767、0777三种权限的文件。

也可以使用符号位的方法来表示,有u(所有者位)、g(所属组位)、o(其他位)、a(所有位)。如-perm /u+x,a+r表示至少包含所有人可读,所有者可写的权限。

-user和-group指定按所有者(或UID)和所属组(或GID)来查找。

2.4.2.15 删除匹配的文件:-delete

可以将查找出来的文件删除掉。

[root@xuexi tmp]# find /tmp/tmp -name "*.sh"

/tmp/tmp/c/2.sh

/tmp/tmp/c/3.sh

/tmp/tmp/c/1.sh

[root@xuexi tmp]# find /tmp/tmp -name "*.sh" -delete

[root@xuexi tmp]# find /tmp/tmp -name "*.sh"

[root@xuexi tmp]#

2.4.3 find配合命令

find可以配合命令来处理查找出来的数据。

-exec command:command为要执行的命令,其中使用{}来接收find的结果,这和xargs的 -i 选项是一样的。命令只能是非别名命令,例如不能执行ll,但是可以执行ls -l。

该命令之后一定要接分号";",表示exec的操作到此结束。也就是说,额外要执行的命令是在"-exec"和";"之间的,而分号";"具有续接第二条命令的特殊意义,所以需要转义,即使用“\;”。

也就是说command之后一定要接“\;”,并且在转义符\之前要有一个空格分隔。

find的不足之处在于一次find只能执行一个命令,但是可以通过将多个命令放进脚本让脚本作为command来改变这个弱点。

-print:将搜索结果分行\n显示出来,默认就是这个选项。还有-print0是将搜索结果使用\0显示出来。

-ok:和-exec功能一样,只是是交互式的询问处理。

测试"-exec":

[root@xuexi tmp]# find / -type f -size +30M 2>/dev/null -exec ls -lh {} \; 

-rw-r--r--. 1 root root 33M Sep 22 17:13 /var/lib/rpm/Packages

-rwxr-xr-x. 1 root root 47M Oct 15  2014 /usr/lib64/libgcj.so.10.0.0

-rw-r--r--. 1 root root 95M Feb 18  2016 /usr/lib/locale/locale-archive

-rw------- 1 root root 128M Sep 26 19:24 /sys/devices/pci0000:00/0000:00:0f.0/resource1

-rw------- 1 root root 128M Sep 26 19:24 /sys/devices/pci0000:00/0000:00:0f.0/resource1_wc

再例如:

[root@xuexi tmp]# find /tmp/tmp;echo -e "\n******next command********\n";find /tmp/tmp -exec ls -l {} \;

/tmp/tmp

/tmp/tmp/b

/tmp/tmp/.x

/tmp/tmp/c

/tmp/tmp/d.txt

/tmp/tmp/a

 

******next command********

 

total 16

-rw-r--r-- 1 root root    7 Sep 26 20:32 a

drwxr-xr-x 2 root root 4096 Sep 26 22:08 b

drwxr-xr-x 2 root root 4096 Sep 26 22:09 c

-rw-r--r-- 1 root root    2 Sep 26 20:56 d.txt

total 0

-rw-r--r-- 1 root root 20 Sep 26 19:03 /tmp/tmp/.x

total 0

-rw-r--r-- 1 root root 2 Sep 26 20:56 /tmp/tmp/d.txt

-rw-r--r-- 1 root root 7 Sep 26 20:32 /tmp/tmp/a

SHELL脚本攻略(学习笔记)--2.4 find

从这个结果中可以看出来,-exec后的命令应用于find后的每一个结果。例如上面首先执行ls -l /tmp/tmp,在执行ls -l /tmp/tmp/b,之后执行后面的每一个。

也可以使用-ok来验证这一点。

[root@xuexi tmp]# find /tmp/tmp -ok ls -ld {} \;    

< ls ... /tmp/tmp > ? y

drwxr-xr-x 4 root root 4096 Sep 26 20:56 /tmp/tmp

< ls ... /tmp/tmp/b > ? y

drwxr-xr-x 2 root root 4096 Sep 26 22:08 /tmp/tmp/b

< ls ... /tmp/tmp/.x > ? y

-rw-r--r-- 1 root root 20 Sep 26 19:03 /tmp/tmp/.x

< ls ... /tmp/tmp/c > ? y

drwxr-xr-x 2 root root 4096 Sep 26 22:09 /tmp/tmp/c

< ls ... /tmp/tmp/d.txt > ? y

-rw-r--r-- 1 root root 2 Sep 26 20:56 /tmp/tmp/d.txt

< ls ... /tmp/tmp/a > ? y

-rw-r--r-- 1 root root 7 Sep 26 20:32 /tmp/tmp/a

[root@xuexi tmp]# find /tmp/tmp -ok ls -ld {} \;

< ls ... /tmp/tmp > ? n

< ls ... /tmp/tmp/b > ? n

< ls ... /tmp/tmp/.x > ? n

< ls ... /tmp/tmp/c > ? n

< ls ... /tmp/tmp/d.txt > ? n

< ls ... /tmp/tmp/a > ? n