Linux shell编程(五)shell脚本常用函数和命令(11)find详解

shell脚本常用函数和命令(11)find详解

find命令格式:find [-path……] -options [-print -exec -ok] 

(1)必选项:
-options 常用的有下选项: 
-name: 按照名字查找 
-prune: 使用这一选项可以使find命令不在当前指定的目录中查找
-user: 文件属主来查找 
-group: 文件所属组来查找 
-nogroup: 查找无有效所属组的文件 
-nouser: 查找无有效属主的文件 
-empty: 查找空文件或空目录
-perm [/|-]mode:安装权限查找, ,-perm /640
             mode:精确权限匹配,如:-perm 755;
             /mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足;9位权限之间存在“或”关系,如:/u+w,g+w;
          -mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足。9位权限之间存在“与”关系;
-type:按照文件类型查找 
f 普通文件
d 目录文件
l 符号链接文件
b 块设备文件
c 字符设备文件
p 管道文件
s 套接字文件
-size [+|-]num UNIT: 按大小查找,常用单位UNIT:k, M, G.如-size +50k
-mtime:按时间查找

  
(2)可选项:
-path:要查找的目录路径。 
      ~ 表示$HOME目录
      . 表示当前目录
      / 表示根目录 
      * 表示 通配任意的字符; 
      ?表示通配任意的单个字符;    
     [] 表示通配括号里面的任意字符;[]里面的内容会被解析成单个字符 。
 
-print:表示将结果输出到标准输出。 
-exec:对匹配的文件执行该参数所给出的shell命令。 
       形式为command {} \;,注意{}与\;之间有空格 

-ok:与exec作用相同,
      区别在于,在执行命令之前,都会给出提示,让用户确认是否执行 


(3)正则表达式  
!: 非条件;
     -a : 与条件(-and);
     -o : 或条件(-or),连接两个不同的条件(两个条件满足其一即可)
     -not: 非条件(与“!”相同,对条件取反)


(4)按名字查找 : 
1.)在当前目录及子目录中,查找大写字母开头的txt文件 
[root@controller1 ~]# find . -name '[a-Z]*.txt' -print  
./netstat.txt
./test.txt

2.)在/etc及其子目录中,查找host开头的文件,默认输出,不用-print
[root@controller1 ~]# find /etc -name 'host*'
/etc/host.conf
/etc/selinux/targeted/active/modules/100/hostname
/etc/hosts

3.)在当前目录及子目录中,查找o开头或sh结尾的文件,不在当前目录下找   
[root@controller1 ~]# find . -name "o*" -prune -o -name "*.sh"
./original-ks.cfg
./openstack-db-mq-memcache.sh
./openstack-keystone.sh



(5)按目录查找   
1.)在目录/root下,除/root/mydir001之外的子目录内搜索 txt文件   
[root@controller1 ~]# find /root -path "/root/mydir001" -prune -o -name "*.txt"   
/root/mydir003/test.txt
/root/mydir004/test.txt
/root/mydir001
/root/mydir005/test.txt
此处,/root/mydir001目录不搜索txt文件结果

2)在当前目录及除mydir001和mydir002之外的子目录中查找txt文件,\转义符号   
[root@controller1 ~]# find . \( -path "./mydir001" -o -path "./mydir002" \) -prune -o -name "*.txt" 
./mydir003/test.txt
./mydir004/test.txt
./mydir001
./mydir002
./mydir005/test.txt

3)在当前目录,不再子目录中,查找txt文件 
[root@controller1 ~]# find . ! -name "." -type d -prune -o -type f -name "*.txt" 
./netstat.txt
./test.txt

(6)按权限查找         
1)在当前目录及子目录中,查找属主具有读写执行,其他具有读执行权限的文件   
[root@controller1 ~]# find /etc -perm 755 
/etc
/etc/grub.d/00_header
/etc/grub.d/01_users
/etc/grub.d/10_linux

2)查找用户有写权限或者组用户有写权限的文件或目录
[root@controller1 ~]# find ./ -perm /u=w,g=w
./cobbler.ks_2018-06-09
./cobbler.ks_2018-06-09+11:36:52
./cobbler.ks_2018-06-0911:37:11
./cobbler.ks_2018-06-09_11:37:41
./openstack-neutron-controller.sh

(7)按类型查找   
1)在当前目录及子目录下,查找目录   
[root@controller1 ~]# find /root -type d    
/root
/root/.cache
/root/.cache/abrt
/root/.config


(8)按属主及属组   
1)查找属主是keystone的文件   
[root@controller1 ~]# find /etc/keystone -user keystone
/etc/keystone/sso_callback_template.html
/etc/keystone/fernet-keys
/etc/keystone/fernet-keys/1
/etc/keystone/fernet-keys/0

2)查找属主被删除的文件 
find / -nouser -type f 

3)查找属组mysql的文件 
[root@controller1 ~]# find /var -group mysql -type d
/var/lib/mysql
/var/lib/mysql/mysql
/var/lib/mysql/performance_schema
/var/lib/mysql/keystone

4)查找用户组被删掉的文件 
find / -nogroup -type f -print 

(6)按时间查找   
1)查找2天内被更改过的目录 
[root@controller1 ~]# find . -mtime -2 -type d
./.cache/abrt
./dir003
./dir006
./dir009
./mydir003
./mydir007  

2)查找2天前被更改过的文件 
[root@controller1 ~]# find . -mtime +2 -type d 
./.cache
./.config
./.config/abrt
./.pki
./.pki/nssdb
./.novaclient

3)查找一天内被访问的文件 
[root@controller1 ~]# find . -atime -1 -type f -print
./mydir003/test.txt
./mydir004/test.txt
./mydir001/test.txt
./mydir005/test.txt

查找一天前被访问的文件 
find . -atime +1 -type f -print   

查找一天内状态被改变的文件 
find . -ctime -1 -type f -print   

查找一天前状态被改变的文件 
find . -ctime +1 -type f -print   

查找10分钟以前状态被改变的文件 
find . -cmin +10 -type f -print 
  
4)查找文件“更新时间”比文件test.txt的内容更新时间新的文件
[root@controller1 ~]# find ./ -newer test.txt
./.cache/abrt/lastnotification
./dir003
./dir006
./dir009

查找文件“访问时间”比文件test.txt的内容更新时间新的文件
[root@controller1 ~]# find ./ -anewer test.txt
./.bashrc
./.cache
./.cache/abrt

5)查找比netstat.txt新,比test.txt旧的文件 
[root@controller1 ~]# find . -newer "netstat.txt" ! -newer "test.txt" 
./.bash_history
./.test.txt.swp
./test.txt


(7)按大小查找   
1)查找超过1M的文件 
[root@controller1 ~]# find . -size +1M -type f 
./cirros-0.3.5-x86_64-disk.img
./ubuntu-16.04-server-cloudimg-amd64-disk1.img

2)查找等于6字节的文件 
[root@controller1 ~]# find . -size 6c -print
./.config/abrt
./.pki/nssdb
./dir003
./dir006
./dir009

3)查找大于10M的文件 
[root@controller1 ~]# find . -size +10M            
./cirros-0.3.5-x86_64-disk.img
./ubuntu-16.04-server-cloudimg-amd64-disk1.img


(8)在find中执行其它命令,注意以“\;” 结束,注意空格
1)查找mydir*目录并删除
[root@controller1 ~]# find . -name "mydir*"
./mydir003
./mydir007
./mydir004


[root@controller1 ~]# find . -name "mydir*" -exec rm -rf {} \;
find: ‘./mydir003’: No such file or directory
find: ‘./mydir007’: No such file or directory
find: ‘./mydir004’: No such file or directory

已经删除这些目录


2)查找openstack-* 并备份为openstack-*.bak 
[root@controller1 ~]# find . -name 'openstack-*' -exec cp {} {}.bak \;

-rw-r--r--  1 root root      5431 Jun  8 16:50 openstack-glance.sh
-rw-r--r--. 1 root root      4745 Jun  7 17:27 openstack-keystone.sh
-rw-r--r--  1 root root      8005 Jun  8 19:44 openstack-nova-controller.sh
  
-rw-r--r--  1 root root      5431 Jul  2 16:15 openstack-glance.sh.bak
-rw-r--r--  1 root root      4745 Jul  2 16:15 openstack-keystone.sh.bak
-rw-r--r--  1 root root      8005 Jul  2 16:15 openstack-nova-controller.sh.bak

(9)清除临时文件
您可以使用 find 命令来清除目录或子目录中在正常使用过程中生成的临时文件,这样可以节省磁盘空间。要实现该操作,请使用下面的命令:
find . \( -name a.out -o -name '*.o' -o -name 'core' \) -exec rm {} \;
 
小括号中的文件掩码标识出了需要删除的文件类型,每个文件掩码的前面都有 -name. 该列表可以扩展为包括您需要清除的系统中的任何临时文件类型。
在代码的编译和连接过程中,程序员及其工具会生成示例中的那些文件类型:a.out, *.o 和 core. 其他的用户通常也会生成类似的临时文件,
可以使用如 *.tmp, *.junk等文件掩码来对命令进行相应的编辑。

(10)复制目录中的内容
find 命令允许您复制目录中的全部内容,同时保持每个文件和子目录的权限、时间和所有权。要完成该操作,需要组合使用 find和 cpio命令,如下所示:

1)组合使用 find 和 cpio 命令
cd /path/to/source/dir
$ find . | cpio -pdumv /path/to/destination/dir
cpio命令是一个复制命令,它设计用来将文件复制到或复制出一个 cpio 或 tar 存档文件,并自动地保持文件和子目录的权限、时间和所有权。

2)结合head,less输出等命令
[root@controller1 ~]# find $HOME/ -name "*.txt" -exec head -n 1 -v {} \;>report.txt
[root@controller1 ~]# cat report.txt 
==> /root/report.txt <==
==> /root/netstat.txt <==
1       (w/o    servers)
==> /root/test.txt <==
admin-openrc

使用每个文本文件的第一行作为标题或者文件内容的描述。可以使用列出文件名和所有文本文件第一行内容的报表更方便地对大量的文本文件进行筛选。

报表中列出了您的 home 目录中所有文本文件的第一行内容,便于进一步地根据需要使用cat命令进行检查:



你可能感兴趣的:(Linux)