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,这已经是前第四天了。
以分钟为单位计数的:-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
从这个结果中可以看出来,-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
SHELL脚本攻略(学习笔记)--2.4 find的更多相关文章
- Linux Shell脚本攻略 读书笔记
Linux Shell脚本攻略 读书笔记 这是一本小书,总共253页,但内容却很丰富,书中的示例小巧而实用,对我这样总是在shell门前徘徊的人来说真是如获至宝:最有价值的当属文本处理,对这块我单独整 ...
- linux shell 脚本攻略学习20--awk命令入门详解
awk生于1977年,创始人有三个,分别为 Alfred Aho,Peter Weinberger, 和 Brian Kernighan,名称源于三个创始人的姓的首字母. 作用:处理文本文件. awk ...
- Linux Shell脚本攻略学习总结:一
终端打印 终端打印的常用命令有两个:echo和print 首先,我先介绍echo 1.echo echo这个命令接受三种形式的参数,实例如下: echo "Hello World" ...
- linux shell 脚本攻略学习3
1.Bash中的READ命令 #读取n个字符存入变量 read -n number_of_chars variable_name 示例: amosli@amosli-pc:~$ read -n var ...
- linux shell 脚本攻略学习2
1.关于文件描述符和重定向: 文件描述符是与一个打开的文件或数据流相关联的整数.文件描述符0.1以及2是系统预留的. 0——stdin(标准输入) 1——stdout(标准输出) 2——stderr( ...
- linux shell 脚本攻略学习19--sed命令详解
sed(意为流编辑器,英语“stream editor”的缩写)是Unix/linux常见的命令行程序.sed用来把文档或字符串里面的文字经过一系列编辑命令转换为另一种格式输出,即文本替换.sed通常 ...
- Linux Shell 脚本攻略学习--四
linux中(chattr)创建不可修改文件的方法 在常见的linux扩展文件系统中(如ext2.ext3.ext4等),可以将文件设置为不可修改(immutable).某些文件属性可帮助我们将文件设 ...
- Linux Shell脚本攻略学习总结:三
根据扩展名切分文件名 首先,我们先来看两个例子: file_jpg="sample.jgp" name=${file_jpg%.*} echo File name is : $na ...
- Linux Shell脚本攻略学习总结:二
比较与测试 程序中的流程控制是由比较和测试语句来处理的. 我们可以用if,if else 以及逻辑运算符来执行测试,而用一些比较运算符来比较数据项.另外,有一个test 命令也可以用来进行测试.让我们 ...
- linux shell 脚本攻略学习5---find命令详解
1.find命令详解 语法: find base_path#base_path可以是任何位置,find会从该位置向下找 实例: amosli@amosli-pc:~$ find /home/amosl ...
随机推荐
- 帝国CMS【操作类型】说明详解
看标签的参数时候,一般最后一个参数是操作类型说明,可是后面写的是:"操作类型说明 具体看操作类型说明", 这个操作类型说明在什么地方看啊 操作类型 说明 操作类型 说明 0 各栏目 ...
- 无需输入密码的scp/ssh/rsync操作方法
一般使用scp/ssh/rsync传输文件时,都需要输入密码.下面是免密码传输文件的方法. 假设要在两台主机之间传送文件,host_src & host_dst.host_src是文件源地址所 ...
- SEL方法选择器
在Objective-C中,选择器(selector)有两个意思. 一是指在代码中的方法的名称.二是指在编译是用于替换方法名称的唯一的标识符.编译后的选择器的为SEL类型.所有名称相同的方法拥有同一个 ...
- isinstance(),issubclass()
isinstance(object,classinfo) 返回True,如果object是classinfo或者classinfo子class的实例. 如果classinfo是包含type和class ...
- ASP.NET Razor——Razor 简介
ASP.NET Razor - 标记 Razor 不是一种编程语言.它是服务器端的标记语言. 什么是 Razor? Razor 是一种标记语法,可以让您将基于服务器的代码(Visual Basic 和 ...
- Java输入输出流(一)——常用的输入输出流
1.流的概念:在Java中,流是从源到目的地的字节的有序序列.Java中有两种基本的流--输入流(InputStream)和输出流(OutputStream). 根据流相对于程序的另一个端点的不同,分 ...
- [转]win7下apache2.4响应很慢解决方法
win7下apache2.4响应很慢解决方法 PS.按照以下方法测试了以下,似乎确实快了一点[skysowe] 转载自: http://blog.sina.com.cn/s/blog_75ad1010 ...
- Win7 Update 遭遇8024200D
可用办法如下: 1.点击开始菜单,点运行,输入cmd然后按回车.然后在命令行下输入: net stop WuAuServ 2.点击开始菜单,点运行,输入%windir%然后按回车. 3.在打开的文件夹 ...
- 【uTenux实验】事件标志
事件标志是一个用来实现同步的对象,由多个位组成,用作指示对应事件存在的标志.事件标志由用来指示对应事件存在的位模式(bitpattern)和一个等待事件标志的任务队列组成. uTenux提供了一组AP ...
- RMAN_学习笔记2_RMAN Setup配置和监控
2014-12-23 Created By BaoXinjian