Linux find命令用来在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。find命令默认的是当前目录,默认的是打印-print。

语法

find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;

参数说明 :

find 根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部份为 path,之后的是 expression。如果 path 是空字串则使用目前路径,如果 expression 是空字串则使用 -print 为预设 expression。

expression 中可使用的选项有二三十个之多,在此只介绍最常用的部份。

-mount, -xdev : 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件

-amin n : 在过去 n 分钟内被读取过

-anewer file : 比文件 file 更晚被读取过的文件

-atime n : 在过去n天内被读取过的文件

-cmin n : 在过去 n 分钟内被修改过

-cnewer file :比文件 file 更新的文件

-ctime n : 在过去n天内被修改过的文件

-empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name

-ipath p, -path p : 路径名称符合 p 的文件,ipath 会忽略大小写

-name name, -iname name : 文件名称符合 name 的文件。iname 会忽略大小写

-size n : 文件大小 是 n 单位,b 代表  位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。-type c : 文件类型是 c 的文件。

d: 目录

c: 字型装置文件

b: 区块装置文件

p: 具名贮列

f: 一般文件

l: 符号连结

s: socket

-pid n : process id 是 n 的文件

你可以使用 ( ) 将运算式分隔,并使用下列运算。

exp1 -and exp2

! expr

-not expr

exp1 -or exp2

exp1, exp2

为了方便测试,先建几个文件

for i in $(seq );do touch $i.py; done;
for i in $(seq );do touch $i.txt; done;
touch TEST.txt
touch test.txt
ls
.py .txt .py .txt .py .txt .py .txt .py .txt TEST.txt test.txt

1.基础查找

find . -print
.
./.txt
./.txt
./.py
./.py
./.py
./.txt
./.py
./.txt
./.txt
./.py

.指定当前目录,..指定父目录,print选项使用\n换行符分割输出的每个文件或目录,而-print0选择则使用空字符'\0'来分割

2.根据文件名查找

find . -name '*.txt' -print
./.txt
./.txt
./.txt
./.txt
./.txt
注意*.txt两边的单引号,shell会扩展没有单引号或是出现在双引号中的通配符。单引号能阻止扩展,使得*.txt能够原封不动的传给find命令。
-iname选项是忽略字母大小写
find . -iname test.txt -print
./TEST.TXT
./test.txt

3.find逻辑查找

-a和-and选项可以执行逻辑与(AND)操作,-o和-or选项可以执行逻辑或(OR)操作
查找后缀为py的或txt的文件
find . -iname '*.py' -o -iname '*.txt'
./.txt
./.txt
./.py
./TEST.TXT
./test.txt
./.py
./.py
./.txt
./.py
./.txt
./.txt
./.py

查找后缀为py且以1开头的文件

find . -iname '*.py' -and -name '1*'
./.py

正则表达式查找

find -iregex '.*\(\.py\|\.txt\)$'
./.txt
./.txt
./.py
./TEST.TXT
./test.txt
./.py
./.py
./.txt
./.py
./.txt
./.txt
./.py

4.否定参数

find也可以用!排除匹配到的模式

find . ! -name "*.txt" -print
.
./.py
./TEST.TXT
./.py
./.py
./.py
./.py

5.基于目录深度搜索

 -maxdepth和-mindepth选项可以现在find命令遍历的目录深度。可以避免find没完没了的查找
find -L /proc -maxdepth  -name 'bundlemaker.def' >/dev/null
 -L选项告诉find命令跟随符号链接
 从/proc目录开始查找
 -maxdepth 1将搜索范围仅限制在当前目录
 -name 'bundlemaker.def'指定待查找的文件
 2>/dev/null将有关循环链接的错误信息发送到空设备中
 
打印出深度距离当前目录至少两个子目录的所有名字以f开头的文件:
 find . -mindepth  -name "f*" -print

6.根据文件类型搜索

列出普通文件

find . -type f -print

列出目录

find . -type d -print

列出符号链接

find . -type l -print

find能够识别的类型与参数

文件类型
类型参数
普通文件
f
符合链接
l
目录
d
字符设备
c
块设备
b
套接字
s
FIFO
p

7.根据时间戳进行搜索

 访问时间(-atime):用户最近一次访问文件的时间。
 修改时间(-mtime):文件内容最后一次被修改的时间。
 变化时间(-ctime):文件元数据(例如权限或所有权)最后一次改变的时间。
-atime、-mtime和-ctime可作为find的时间选项。它们可以用整数值来指定天数。这些数字前面可以加上-或+。-表示小于,+表示大于。
 
打印出在最近7天内被访问过的所有文件
find . -type f -atime - -print

打印出恰好在7天前被访问过的所有文件

find . -type f -atime  -print

打印出访问时间超过7天的所有文件

find . -type f -atime + -print
-atime、-mtime以及-ctime都是以“天”为单位来计时的。find命令还支持以“分钟”
为计时单位的选项。这些选项包括:
 -amin(访问时间);
 -mmin(修改时间);
 -cmin(变化时间)。
打印出7分钟之前访问的所有文件:
find . -type f -amin + -print

8.基于文件大小的搜索

# 大于2KB的文件
 find . -type f -size +2k
# 小于2KB的文件
find . -type f -size -2k
# 大小等于2KB的文件
 find . -type f -size 2k
除了k之外,还可以用其他文件大小单位。
q b:块(512字节)。
q c:字节。
q w:字(2字节)。
q k:千字节(1024字节)。
q M:兆字节(1024K字节)。
q G:吉字节(1024M字节)。
 
 
 9.基于文件权限和所有权的匹配
 
打印出权限为644的文件
find . -type f -perm  -print

Web服务器上的PHP文件需要具有合适的执行权限。我们可以用下面的方法找出那些没有设置好执行权限的PHP文件:

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

查找前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件:

find . -type f -perm  -exec ls -l {} \;
 
10.利用find执行相应操作
(1)删除.swp文件
find . -type f -name test.swp -delete

(2)删除其他文件

find . -type f -name "*黑名单*" -print0 | xargs - rm -f
find . -type f -name "*.py" -exec rm {} \;
find . -type f -name "*.py" -print | xargs rm -f
find . -type f -name "*.py" | xargs rm -f
find . -type f -name "*.py" | xargs -I {} rm -f {}
查找/var/log目录中更改时间在7日以前的普通文件,并在删除之前询问它们:
find /var/log -type f -mtime + -ok rm {} \;

(3)执行命令-exec

find命令使用一对花括号{}代表文件名。在下面的例子中,对于每一个匹配的文件,find命令会将{}替换成相应的文件名并更改该文件的所有权。如果find命令找到了root所拥有的两个文件,那么它会将其所有者改为slynux:
find . -type f -user root -exec chown slynux {} \;
注意该命令结尾的\;。必须对分号进行转义,否则shell会将其视为find命令的结束,而非chown命令的结束。下列命令可以将10天前的 .txt文件复制到OLD目录中:
find . -type f -mtime + -name "*.txt" -exec cp {} OLD \;
我们无法在-exec选项中直接使用多个命令。该选项只能够接受单个命令,不过我们可以耍一个小花招。把多个命令写到一个shell 脚本中( 例如command.sh),然后在-exec中使用这个脚本:
-exec ./commands.sh {} \;

11.find跳过特定的目录

find devel/source_path -name '.git' -prune -o -type f -print
-name ".git" –prune是命令中负责进行修剪的部分,它指明了.git目录应该被排除在外。
-type f –print描述了要执行的操作。
 
参考:https://www.runoob.com/linux/linux-comm-find.html
          《Linux_Shell脚本攻略.第3版》第二章

shell学习(19)- find查找命令的更多相关文章

  1. Shell学习:grep, sed, awk命令的练习题

    http://www.cnblogs.com/chengmo/archive/2013/01/17/2865479.html 文件:datafileSteve Blenheim:238-923-736 ...

  2. 【shell学习笔记】curl命令总结

    2014-12-16 20:34 文思海辉 =========== CURL命令总结 1. 下载 curl -o [文件名称] www.baidu.com 2. 显示 HTTP request头信息 ...

  3. SHELL学习笔记三

    SHELL学习笔记一 SHELL学习笔记二 SHELL学习笔记三 for 命令 读取列表中的复杂值 从变量读取列表 从命令读取值 更改字段分隔符 用通配符读取目录 which 使用多个测试命令 unt ...

  4. Shell学习(七)——sort、uniq、cut、wc命令详解

    Shell学习(七)--sort.uniq.cut.wc命令详解 转自:[1]linux sort,uniq,cut,wc命令详解 https://www.cnblogs.com/ggjucheng/ ...

  5. Linux学习之查找命令汇总

    我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索:        which  查看可执行文件的位置.       whereis 查看文件的位置.         ...

  6. Linux学习之常用网络通信命令与shell简单应用技巧(四)

    (一)常用网络通信命令 (1)ping命令 (2)write命令 (3)wall命令 (4)ifconfig命令 (5)shutdown命令 (6)reboot命令 (二)shell简单应用技巧 (1 ...

  7. bash shell学习笔记(一)—— 常用命令

    一.基本的bash shell命令 1.默认bash shell 提示符是美元符号($); 2.bash手册 使用man命令来访问存储在Linux系统上的手册页面,如: bogon:~ Mac$ ma ...

  8. linux shell 学习笔记--内部命令学习

    .基本命令 新手必须要掌握的初级命令 ls 基本的列出所有文件的命令.但是往往就是因为这个命令太简单,所以我们总是低估它.比如 ,用 -R 选项,这是递归选项,ls 将会以目录树的形式列出所有文件, ...

  9. 2. 2.1查找命令——linux基础增强,Linux命令学习

    2.1.查找命令 grep命令 grep 命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并 把匹配的行打印出来. 格式: grep [option] pattern [file] 可使用 ...

  10. shell 学习笔记4-shell内置变量命令

    一.shell 的一些内置命令 常用的一内部命令有:echo.eval.exec.export.read.shift 1.echo命令-在屏幕中输出信息 1)说明 格式:echo args #< ...

随机推荐

  1. LA4254 Processor

      题意:有n个任务,每个任务有三个参数ri,di和wi,表示必须在时刻[ri,di]之内执行,工作量为wi.处理器执行速度可以变化,当执行速度为s时,工作量为wi.处理器的速度可以变化,当执行速度为 ...

  2. bootstrap--栅格系统布局

    栅格布局使用例子: <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset=&q ...

  3. 组件化开发之vue

    今天写了写vue的组件化开发demo,有些小的心得.分享一下. 组件化意味着代码可以复用,调用组件就可以了.然后可以通过组件调用组件的相关能力. 例如以前我做组件化开发的一个小项目 原生js组件的实现 ...

  4. 读书笔记--Head First JavaScript 目录

    1.交互式网络 2.存储数据 3.探索客户端 4.决策 5.循环 6.函数 7.表单与验证 8.驾驭网页 9.为数据带来生命 10.创建自定义对象 11.除错务尽 12.动态数据

  5. 使用JSP渲染Web视图

    Pom文件引入以下依赖 注意,创建SpringBoot整合JSP,一定要为war类型,否则会找不到页面 不要把jsp页面存放在Resources目录下,resources目录是给springboot打 ...

  6. MySQL数据库起步 关于数据库的基本操作(更新中...)

    mysql的基本操作 连接指定的服务器(需要服务器开启3306端口) mysql -h ip地址 -P 端口号 -u 账号 -p 密码 删除游客模式 mysql -h ip地址 -P 端口号 -u 账 ...

  7. Maven常用命令备忘

    1. 修改版本号 mvn versions:set -DnewVersion=1.0.1-SNAPSHOT 2. <relativePath>的默认值是../pom.xml,如果没有配置, ...

  8. arcgis几何对象

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. 【JZOJ3214】【SDOI2013】方程

    ╰( ̄▽ ̄)╭ 给定方程 X1+X 2+-+Xn=m 我们对第 1.. n1 个变量 进行一些限制 : X1≤A1 X2≤A2 - Xn1 ≤An1 我们对第 n1+1.. n1+1.. n1+ n2 ...

  10. IntelliJ IDEA添加过滤文件或目录(转)

    在idea上使用svn后,发现即使svn窗口添加过滤正则没有忽略.iml文件的提交,安装ignore插件后没发现有svn的忽略选项,最后发现这样设置就可以了: 1.Settings→Editor→Fi ...