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. Leetcode173. Binary Search Tree Iterator二叉搜索树迭代器

    实现一个二叉搜索树迭代器.你将使用二叉搜索树的根节点初始化迭代器. 调用 next() 将返回二叉搜索树中的下一个最小的数. 注意: next() 和hasNext() 操作的时间复杂度是O(1),并 ...

  2. 主流浏览器HTML5视频格式差异

    因最近在研究video.js,现在遇到的问题是在js中设置了swf,但是在ie8下只是显示黑屏并没有播放视频,在网上进行搜索时查到了有关各个浏览器支持哪些视频格式的文章,现在此记录下,方便以后查阅. ...

  3. Mac 安装package control

    参考网址:https://packagecontrol.io/installation 复制命令就不说明了. 主要阐述下第二种,下载安装包覆盖的方法,下面不说话,依次截图.步骤可以查看参考网址 啰嗦一 ...

  4. CoffeeScript 更优美的Javascript

    CoffeeScript 是一门编译到 JavaScript 的小巧语言. 在 Java 般笨拙的外表下, JavaScript 其实有着一颗华丽的心脏. CoffeeScript 尝试用简洁的方式展 ...

  5. drf作业01

    api\urls from django.conf.urls import url from . import views urlpatterns = [ url(r'^cars/$',views.C ...

  6. C#如何检测网络端口连接的状态

    原文:C#如何检测网络端口连接的状态 C#如何检测/监控远程连接网络端口的情况(例如:3389端口是否处于监听状态,是否建立了连接等). using System; using System.Coll ...

  7. 开始使用Apache弗林克和Mapr Streams

    Introduction MapR Ecosystem Package 2.0 (MEP) is coming with some new features related to MapR Strea ...

  8. 助力深度学习!阿里开源可插拔 GPU 共享调度工具

    根据 Gartner 对全球 CIO 的调查结果显示,人工智能将成为 2019 年组织革命的颠覆性力量.对于人工智能来说,算力即正义,成本即能力,利用 Docker 和 Kubernetes 代表云原 ...

  9. roc.m

    function [tpr,fpr,thresholds] = roc(targets,outputs) %ROC Receiver operating characteristic. % % The ...

  10. DataGrid无故多一行空白行

    DataGrid绑定datatable时, Datagrid.Itemsource=dt.DefaultView: 发现DataGRID会多处一行 解决如下: 对Datagrid的CanUserAdd ...