Linux-find命令学习

一、前言

  find命令用于在指定目录下查找文件,并且搜索完成后可以执行相应的操作,搜索时我们可以根据参数指定相应的搜索条件,比如按文件名,文件类型,时间戳等。find命令的功能特别强大,今天就来简单学习下它的使用。

二、命令介绍

首先,我们find --help一下,可以看到find命令的格式为:

find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

好像看上去比较复杂,没事一般的时候我们也用不到,我们来简化一下这个格式:

find path -options[-print][-exec][-ok][...]

这里介绍下相应的参数:

  • path,表示find命令所查找的目录,比如用.来表示当前目录,用/来表示系统根目录;
  • -print,表示将查找到的文件输出到标准输出,如果没有指定,默认是该模式;
  • -exec,对查找到的文件执行该参数所给出的shell命令,相应命令的形式为'command' {} ;,注意 {} 和 \ ; 之间的空格;
  • -ok,和-exec选项功能类似,但该选项更安全,在执行每一个命令之前,都会给出提示,让用户来确定是否执行;

另外,相应的查询参数:

-name   按照文件名查找文件;
-iname  按照文件名查找,但会忽略大小写;
-perm   按照文件权限来查找文件;
-prune  查找时忽略某目录;

-path pattern:根据完整路径查找文件名为pattern的文件;
-ipath:忽略大小写;

-empty:查找文件为空而且是一个普通文件或者目录;

-type  查找某一类型的文件,比如:
b -块设备文件;
c -字符设备文件;
d -目录;
p -管道文件;
f -普通文件;
l -符号链接文件;
s -socket文件;

-amin n   查找系统中最后N分钟访问的文件
-atime n  查找系统中最后n天访问的文件
-cmin n   查找系统中最后N分钟被改变文件状态的文件
-ctime n  查找系统中最后n天被改变文件状态的文件
-mmin n   查找系统中最后N分钟被改变文件数据的文件
-mtime n  查找系统中最后n天被改变文件数据的文件

其中 -size表示按照文件大小来查找,这里来详细说下:格式为 -size +1000n,其中n表示单位:

  • c 以字节单位;
  • b 以块为单位,其中块大小为512字节,这个是默认单位;
  • w 以words为单位,words表示两个字节;
  • k 以1024字节为单位,也就是kilo bytes,kb;
  • M-类似,以1024*1024字节为单位,也就是Mb;
  • G-Gb;

另外,这里的前缀+-,和时间是同一个意思,加号表示查找大于给定长度的文件,减号则是表示查找小于给定长度的文件;

三、实例

接下来,我们通过一些实例来看一下find命令的使用。首先,先看下最基础的查找模式,也就是默认是-print的模式。

1. print 标准模式
1.1 查找48小时内修改过的文件
master@127.0.0.1:~$ find -atime -2
./.bash_profile
./.viminfo
./.viminfz.tmp
./.bash_history
./.bash_logout
1.2. 查找当前目录下以某个格式结尾的文件
master@127.0.0.1:/logs$ find . -name "*.log"
./redis.log
./test1.log
./test2.log
./test3.log
./test4.log

由于展示结果是类似的,所以这里只列相应的命令。
1.3)查找/logs目录下权限为 644的文件:

master@127.0.0.1:/logs$ find /log -perm 644

另外,我们在使用八进制查询的时候,可以在八进制数字前面加一个横杠 -,表示都匹配,如-007就相当于777,-005相当于555;
1.4)查找当目录以.log结尾的普通文件:

master@127.0.0.1:/logs$ find . -type f -name "*.log"

1.5)查找当前所有目录并排序:

master@127.0.0.1:/logs$ find . -type d | sort

1.6)查找当前目录大于1k的文件:

master@127.0.0.1:/logs$ find . -size +1000c -print
.
./temp
./temp/test-master
./lib
./lib/netty-codec-4.1.14.Final.jar
./lib/spring-rabbit-2.0.1.RELEASE.jar

这里,大于与小与的查询是可以同时使用的,如 查询 文件大小大于2M小于10M的:

master@127.0.0.1:/logs$ find . -size +2M -size -10M -print

1.7)在/目录下查找/start开头并且以end结尾的文件

master@127.0.0.1:/logs$ find / -path "/start*end"

1.8)如果在查找文件时希望忽略某个目录,我们可以使用-prune选项,但使用的时候需要注意下,因为如果同时使用了-depth选项,那么-prune选项就会被find命令忽略,如果希望在test目录下查找文件,但不希望在test/test3目录下查找,可以使用:

master@127.0.0.1:/logs$ find test -path "test/test3" -prune -o -print

1.9)另外,我们可以借助-printf 来打印查找到的文件的相应属性,比如时间,大小等;

master@127.0.0.1:/logs$ find -type f -printf '%T+%p \n'
2019-06-10+16:18:39.8681443600./logs/test2.log

有关更多printf,可以参考:http://man.he.net/man1/find,然后搜索 **printf **,即可看到所有的选项。

2. exec 与ok 模式

如果只是查找的话,上面的这些查询已经够我们平时用了,不过我们有时候不仅仅是只查找一下,可能还会有后缀的操作,这个时候就要使用-exec模式了。

-exec后面跟的是shell命令,表示查询出对应的文件后进行其他命令操作。该模式结束是以 ; 为标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面会加反斜杠。

该命令格式一般为:

find path -exec command' {} \;

首先是exec选项,后面是要执行的命令或脚本,然后是一对{ },一个空格和一个\,最后是一个分号。其中花括号代表前面find查找出来的文件名;

2.1 查看并列出对应文件:
master@127.0.0.1:/logs$ find . -type f -exec ls -l {} \;

要注意末尾的花括号与斜杠之间的空格;

2.2 查找并删除修改时间在2天以前的文件:
master@127.0.0.1:/logs$ find . -type f -mtime +2 -exec rm {} \; 

在任何删除之前,都应该先查看相应的文件,以免进行误删除操作;而 -ok 选项则可以看作是exec的安全模式,它会在删除前提示你进行确认:

master@127.0.0.1:/logs$ find . -name "*.log" -ok rm {} \; 
< rm ... ./test2.log > ? y

它会在删除前进行确认,按y键进行删除,按n键取消删除;

2.3 查找文件并查找文件中的内容:

任何形式的命令都可以在exec选项中使用,这里我们可以使用grep来配合find命令:

master@127.0.0.1:/logs$  find /test -name "passwd*" -exec grep "root" {} \;

这里首先查找所有文件名以“passwd”开头的文件,然后执行grep命令看看在这些文件中是否存在一个root用户。

2.4 查找并复制文件到指定目录:

另外如果查找后移动或者复制文件到某个目录下的话,新的目录在花括号后指定,如:

master@127.0.0.1:/logs$ find . -name "*.log" -exec cp {} test3 \;

四、总结

当然除了这几种模式外,还有其他的模式,比如-execdir-okdir等,等用到的时候再回来更新吧。

本文参考自:
每天一个linux命令(22):find 命令的参数详解
https://www.cnblogs.com/peida/archive/2012/11/15/2770888.html
http://man.he.net/man1/find
Linux中find命令使用-linux.cn

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容