Shell-find命令
从指定的起始目录开始,递归地搜索其各个子目录,查找满足寻找条件的文件,并可以对其进行相关的操作
语法
find [目录] option [-exec/-ok] command {} \;
`-exec` execute执行,直接执行后面的command,不用询问是否执行
`-ok` OK?,执行后面的command会询问Y/N
`{}` 表示要执行的命令的参数即为找到的文件,命令末尾必须以 \; 结尾分号不能少
## 选项:
`-name` 指定文件名所必须匹配的字符串,可以将通配符作为参数使用
`-iname` 与name类似,只是忽略字母大小写
`-path` 使用通配符来匹配文件路径
## 逻辑运算符
`!`/`-not` 否定参数含义
`-o`/`-or` or条件操作,匹配多个条件中的一个
`-a`/`-and` and条件操作,两个测试都必须为真
## 限制搜索深度
`-maxdepth` 指定最大查找深度,即最大向指定目录下面搜索maxdepth级
`-mindepth` 指定最小查找深度,即从指定目录下面第mindepth级目录开始搜索
## 根据权限/文件拥有者
`-perm` 按照权限查找:-perm 755
`-prune` 使用此选项可以使find命令不在当前指定的目录中查找
`-user`/`-nouser` 按照文件属主来查找/查找无有效属主的文件
`-group`/`-nogroup` 按照文件属组来查找/查找无有效所属租的文件
`-gid n` 查找系统中文件数字组ID为 n 的文件
## 根据访问/修改/变化时间
`-amin n` 查找系统中最后n分钟访问的文件
`-atime n` 查找系统中最后n*24小时{即n天前}访问的文件
`-cmin n` 查找系统中最后n分钟被改变文件状态的文件
`-ctime n` 查找系统中最后n*24小时{即n天前}被改变文件状态的文件
`-mmin n` 查找系统中最后n分钟被改变文件数据的文件
`-mtime n` 查找系统中最后n*24小时{即n天前}被改变文件数据的文件
`-newer "文件名"` 查找比指定文件新的文件
## 根据文件类型查找
`-type` 查找某一类型的文件
type的选项:
b : 块设备文件
d : 目录
c : 字符设备文件
f : 普通文件
p : 管道文件
l : 符号链接文件
s : 套接字文件
`-empty` 查找为空的文件
## 根据文件大小
`-size` [+-]n[cwbkMG] 按容量大小查找
c : 字节表示n个字节
w : 双字节表示n个双字节
b : 512字节的数据块(默认)
k : KB为单位
M : MB为单位
G : GB为单位
`-false` 查找系统中总是错误的文件
`-follow` 如果find命令遇到符号链接文件,就跟踪至链接所指向的文件
## 找到文件后执行命令
`-exec command {} \;` 查找指定的文件并执行指定的命令command{注意:末尾的分号不能少}
`-print` 将结果打印到标准输出
举例
# 找到文件file.txt并cat出内容
find /home -type f -name file.txt -exec cat {} \;
# ? 会询问是否cat该文件
find /home -type f -name file.txt -ok cat {} \;
# 找出/var目录下大于5M的文件,并且将它们拷贝到/home/software 目录中
find . -size +2M -exec ls -l {} \;
find . -size +5M -exec cp -r /home/software {} \;
# 删除当前目录下所有的.swp文件
find . -type f -name "*.swp" -delete
## xargs命令
# find命令可以把匹配到的文件传递给 xargs 命令执行,在使用 find 命令的 -exec 选项处理匹配到的文件时,find将所有匹配到的文件一起传递给 exec 执行
# 由于有些系统对能够传递给 exec 的命令长度有限制,这样会引起溢出错误
# 这时可以使用 xargs 命令
# 查找系统中的每一个普通文件,并用 file 命令来测试它们分别属于哪一类文件
find . -type f -print | xargs file
# 查找当前目录下的 .log 文件,并删除
find . -type f -name "\.log" -print | xargs rm
# 用 ls -l 列出所有匹配到的文件
find . -type f -exec ls -l {} \;
# 查找 log 中更改时间在 5 天前的文件并删除
find logs -type f -mtime +5 -exec rm {} \;
# 查找 log中的所有普通文件并在删除前确认
find logs -type f -ok rm {} \;
# 查找当前目录下的 .log 文件,并从查找结果中筛选出带有 node 字符串的文件
find . -type f -name "\.log" -print | gerp "node"
## 经典的移动mv
find ./ -type f -name "*.sh" | xargs mv -t /opt/
find ./ -type f -name "*.sh" | xargs -i mv {} /opt/
find ./ -type f -name "*.sh" -exec mv {} /opt/ \; # \转意符号,否则`;`不被shell识别.
mv `find ./ -type f -name "*.sh"` /opt/
cp $(find ./ -type f -name "*.sh" ) /opt/