Linux-find命令学习

2019-06-15  本文已影响0人  骑着乌龟去看海

一、前言

  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

上一篇下一篇

猜你喜欢

热点阅读