Shell脚本攻略之命令之乐(find)

1.文件查找与文件列表

find命令的工作方式如下:沿着文件层次结构向下遍历,匹配符合条件的文件,执行相应的操作

实例:

 find . -print
# . 指定当前目录  ..指定父目录   打印文件和目录的列表    -print指明打印出匹配的文件名(路径),'
'作为用于对输出的文件名进行分隔   -print0指明使用''作为匹配的文件名之间的定界符

2.根据文件名或正则表达式进行搜索:

find /home/chunyu -name "*.txt" -print

#选项-name的参数指定了文件名所必须匹配的字符串,-iname(忽略大小写)
#可以把通配符作为参数使用,"*.txt"能够匹配所有以.txt结尾的文件名

如果想匹配多个条件中的一个,可以采用OR条件操作:

find . ( -name "*.txt" -o -name "*.pdf" ) -print

#find命令能够匹配所有这两类文件
#  (  以及   )用于将 -name  "*.txt" -o "*.pdf" 视为一个整体

3.匹配文件路径:

 find /home/chunyu -path "*/chunyu/*" -print
#选项-path的参数可以使用通配符来匹配文件路径

#-path将文件路径作为一个整体进行匹配

4.基于正则表达式来匹配文件路径:

 find . -regex ".*(.py|.sh)$"

#-iregex可以让正则表达式忽略大小写

5.基于目录深度的搜索:find命令在使用时会遍历所有的子目录,我们可以采用深度选项-maxdepth和-mindepth来限制find命令遍历的目的深度,-maxdepth和-mindepth应该作为find的第三个参数出现

find . -maxdepth 1 -name "f*" -print

#只允许find在当前目录中查找,深度可以设置为1;
#当需要向下两级时,深度可以设置为2

#可以指定一个最小深度,告诉find应该从此处开始向下查找

#上述命令,列出当前目录下的所有以f开头的文件,即使有子目录,也不会被打印和遍历

6.根据文件类型搜索:Unix类系统将一切视为文件,文件具有不同的类型,例如普通文件,目录,字符设备,块设备,符号链接,硬链接,套接字以及FIFO等

find . -type d -print

#-type可以对文件搜索进行过滤,指明特定的文件匹配类型

#普通文件  f
  符号链接  l 
  目录        d 
  字符设备   c
  块设备      b 
  套接字      s
  FIFO        p

7.根据文件时间进行搜索:Unix和Linux文件系统中的每一个文件都有三种时间戳,Unix中并没有所谓“创建时间”的概念

访问时间(-atime):用户最近一次访问文件的时间

修改时间(-mtime):文件内容内容最后一次被修改的时间

变化时间(-ctime):文件元数据(例如权限和所有权)最有一次改变的时间

find . -type f -atime -7 -print

#-atime  -mtime -ctime可以作为find的时间选项

#它们可以用整数值来指定,单位是天

#这些数值通常还可以带有  +和-  ,+表示大于多少天,-表示小于多少天

#上述命令,打印出最近7天内被访问的所有文件

其他一些基于时间的参数是以分钟作为计量单位

-amin(访问时间-分钟)

-mmin(修改时间-分钟)

-cmin(变化时间-分钟)

find . -type f -amin +7 -print

#打印出访问时间超过7分钟的所有文件

find的另一个漂亮的特性是 -newer参数,使用 -newer 我们可以指定一个用于比较时间戳的参考文件,然后找出比参考文件更新的(更近的修改时间)所有文件

 find . -type f -newer catTest.sh -print

8.基于文件大小的搜索:

find . -type f -size +2k
#同理,+2k表示大于2kb的文件搜索,-2k表示小于2kb的文件进行搜索
#其他文件大小单元
   b  块(512字节)
   c  字节
   w  字(2字节)
   k   1024字节
   M   1024K字节
   G    1024M字节

9.删除匹配的文件

find . -type f -name  "*.swp" -delete
#选项-delete可以用来删除find查找的匹配文件

10.基于文件权限和所有权的匹配

find . -type f -perm 644 -print

#-perm 指明find应该只匹配具有特定权限值的文件

find . -type f -name "*.php" ! -perm 644 -print

#用上述命令可以搜索出没有设置好执行权限的PHP文件

根据文件所有权进行搜索:

 find . -type f -user chunyu -print

#打印出用户chunyu拥有的所有文件,参数USER可以是用户名或者UID

11.利用find命令执行命令或动作:find命令可以借助选项-exec与其他命令进行结合

sudo find /home/chunyu -type f -user root -exec chown chunyu {} ;

#注意这里运行命令必须使用sudo,才有权限修改文件所属权限

#在这个命令中,{}是一个与-exec选项搭配使用的特殊字符,对于每一个匹配的文件,{}会被替换成相应的文件名

#例如find的命令找到两个文件test1.txt和test2.txt,其所有者均为root那么find就会执行:chown chunyu test1 和chown chunyu test2.txt

 -exec能够同printf结合来生成有用的才输出信息:

find . -type f -name "*.txt" -exec printf "Text file:%s
" {} ;

12.让find跳过特定的目录:

find PycharmProjects/ShellCute ( -name ".git" -prune ) -o ( -type f -print )

#以上命令打印出不包括在.giut目录中的所有文件的名称(路径)

#( -name ".git" -prune )的作用是用于进行排查,它指明了.git目录应该被排除在外  而  ( -type f -print ) 指明了需要执行的动作

原文地址:https://www.cnblogs.com/hqutcy/p/8862232.html