Linux 中 find 常见用法示例:http://blog.csdn.net/freeking101/article/details/51203183
1. find 命令选项。
find 命令的一般形式为:find pathname -options [-print -exec -ok]
find 命令的参数:
pathname find 命令所查找的目录路径。例如:用.来表示当前目录,用/来表示系统根目录。
- -print:find 命令将匹配的文件输出到标准输出。
- -exec:find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为' comm - and' {} \;,注意{ }和\;之间的空格。
- -ok 和 -exec 的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
find 命令部分选项。find命令有很多选项或表达式,每一个选项前面跟随一个横杠-。
-name 按照文件名查找文件。
-perm 按照文件权限来查找文件。
-prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用了-depth选项,那么-prune选项将被find命令忽略。
-user 按照文件属主来查找文件。
-group 按照文件所属的组来查找文件。
-mtime -n +n 按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。
find命令还有-atime和-ctime选项,但它们都和-mtime选项相似,所以我们在这里只介绍-mtime选项。
-nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件。
-type 查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
-size n[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype 查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件
/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount 在查找文件时不跨越文件系统mount点。
-follow 如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio 对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。
使用 name 选项
文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。
可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。
不管当前路径是什么,如果想要在自己的根目录$HOME中查找文件名符合*.txt的文件,
使用~作为'pathname参数,波浪号~代表了你的$HOME目录。
$ find ~ -name "*.txt" -print 在家目录及子目录中查找所有的‘*.txt’文件
$ find . -name "*.txt" -print 在当前目录及子目录中查找所有的‘*.txt’文件
$ find . -name "[A-Z]*" -print 当前目录及子目录中查找文件名以一个大写字母开头的文件
$ find /etc -name "host*" -print 在/etc目录中查找文件名以host开头的文件
$ find ~ -name "*" -pri或ntf ind . -print 查找$HOME目录中的文件
$ find / -name "*" -print 从根目录开始查找(太消耗系统资源,不建议使用,如果好似用可以加上 & ,让后台执行)
如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是*.txt的文件,下面的命令就能够返回名为ax37.txt的文件:
$ find . -name "[a-z][a-z][0-9][0-9].txt" -print
使用 perm 选项:
如果希望按照文件权限模式来查找文件的话,可以采用-perm选项。
你可能需要找到所有用户都具有执行权限的文件,或是希望查看某个用户目录下的文件权限类型。
在使用这一选项的时候,最好使用八进制的权限表示法。
为了在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:
$ find . -perm 755 -print如果希望在当前目录下查找所有用户都可读、写、执行的文件(要小心这种情况),我们可以使用find命令的-perm选项。
在八进制数字前面要加一个横杠-。
在下面的命令中-perm代表按照文件权限查找,而‘007’和你在chmod命令的绝对模式中所采用的表示法完全相同。
$ find . -perm -007 -print
忽略 某个目录
如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用-prune选项来指出需要忽略的目录。
在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。
如果希望在/apps目录下查找文件,但不希望在/apps/bin目录下查找,可以用:
$ find /apps -name "/apps/bin" -prune -o -print
使用 user 和 nouser 选项
如果希望按照文件属主查找文件,可以给出相应的用户名。
例如,在$HOME目录中查找文件属主为dave的文件,可以用:
$ find ~ -user dave -print
在/etc目录下查找文件属主为uucp的文件:
$ find /etc -user uucp -print
为了查找属主帐户已经被删除的文件,可以使用-nouser选项。这样就能够找到那些属主
在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时,不必给出用户名; find命令
能够为你完成相应的工作。例如,希望在/home目录下查找所有的这类文件,可以用:
$ find /home -nouser -print
使用 group 和 nogroup 选项
就像user和nouser选项一样,针对文件所属于的用户组, find命令也具有同样的选项,为
了在/apps目录下查找属于accts用户组的文件,可以用:
$ find /apps -group accts -print
要查找没有有效所属用户组的所有文件,可以使用nogroup选项。下面的find命令从文件
系统的根目录处查找这样的文件
$ fine/-nogroup-print
按照更改时间查找文件
如果希望按照更改时间来查找文件,可以使用mtime选项。如果系统突然没有可用空间了,
很有可能某一个文件的长度在此期间增长迅速,这时就可以用 mtime 选项来查找这样的文件。用减号-来限定更改时间在距今n日以内的文件,
用加号+来限定更改时间在距今n日以前的文件。希望在系统根目录下查找更改时间在5日以内的文件,可以用:
$ find / -mtime -5 -print
为了在/var/adm目录下查找更改时间在3日以前的文件,可以用:
$ find /var/adm -mtime +3 -print
查找比某个文件新或旧的文件
如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用-newer选项。
它的一般形式为:
newest_file_name ! oldest_file_name
其中,!是逻辑非符号。这里有两个文件,它们的更改时间大约相差两天。
下面给出的find命令能够查找更改时间比文件age.awk新但比文件belts.awk旧的文件:
如果想使用find命令的这一选项来查找更改时间在两个小时以内的文件,
除非有一个现成的文件其更改时间恰好在两个小时以前,否则就没有可用来比较更改时间的文件。
为了解决这一问题,可以首先创建一个文件并将其日期和时间戳设置为所需要的时间。这可以用 touch 命令来实现。
假设现在的时间是 23:40,希望查找更改时间在两个小时以内的文件,
可以首先创建这样一个文件:一个符合要求的文件已经被创建;这里我们假设今天是五月四日,
而该文件的更改时间是 21:40,比现在刚好早两个小时。
现在我们就可以使用 find 命令的 -newer 选项在当前目录下查找所有更改时间在两个小时以内的文件:
$ find . -newer dstamp -print
使用 type 选项
UNIX 或 LINUX 系统中有若干种不同的文件类型,这部分内容我们在前面的章节已经做了介绍,这里就不再赘述。
如果要在 /etc 目录下查找所有的目录,可以用:
$ find /etc -type d -print
为了在当前目录下查找除目录以外的所有类型的文件,可以用:
$ find . ! -type d -print
为了在/ e t c目录下查找所有的符号链接文件,可以用:
$ find /etc -type l -print
使用 size 选项
可以按照文件长度来查找文件,这里所指的文件长度既可以用块( block)来计量,也可以用字节来计量。
以字节计量文件长度的表达形式为 Nc;以块计量文件长度只用数字表示即可。
就我个人而言,我总是使用以字节计的方式,在按照文件长度查找文件时,
大多数人都喜欢使用这种以字节表示的文件长度,而不用块的数目来表示,
除非是在查看文件系统的大小,因为这时使用块来计量更容易转换。
为了在当前目录下查找文件长度大于 1M字节的文件,可以用:
$ find . -size +1000000c -print
为了在 /home/apache 目录下查找文件长度恰好为 100字节的文件,可以用:
$ find /home/apache -size 100c -print
为了在当前目录下查找长度超过 10 块的文件(一块等于 512字节),可以用:
$ find . -size +10 -print
使用 depth 选项
在使用find命令时,可能希望先匹配所有的文件,再在子目录中查找。使用 depth选项就
可以使find命令这样做。这样做的一个原因就是,当在使用find命令向磁带上备份文件系统时,
希望首先备份所有的文件,其次再备份子目录中的文件。
在下面的例子中, find命令从文件系统的根目录开始,查找一个名为CON.FILE的文件。
它将首先匹配所有的文件然后再进入子目录中查找。
$ find / -name "CON.FILE" -depth -print使用mount选项
在当前的文件系统中查找文件(不进入其他文件系统),可以使用find命令的mount选项。
在下面的例子中,我们从当前目录开始查找位于本文件系统中文件名以X C结尾的文件:
$ find . -name "*.XC" -mount -print
使用 cpio 选项
cpio命令可以用来向磁带设备备份文件或从中恢复文件。可以使用find命令在整个文件系
统中(更多的情况下是在部分文件系统中)查找文件,然后用cpio命令将其备份到磁带上。
如果希望使用cpio命令备份/etc、/home和/apps目录中的文件,可以使用下面所给出的命令,
不过要记住你是在文件系统的根目录下:(在上面的例子中,第一行末尾的\告诉shell命令还未结束,忽略\后面的回车。)
在上面的例子中,应当注意到路径中缺少/。这叫作相对路径。
之所以使用相对路径,是因为在从磁带中恢复这些文件的时候,可以选择恢复文件的路径。
例如,可以将这些文件先恢复到另外一个目录中,对它们进行某些操作后,再恢复到原始目录中。
如果在备份时使用了绝对路径,例如/etc,那么在恢复时,就只能恢复到/etc目录中去,别无其他选择。
在上面的例子中,我告诉find命令首先进入/ e t c目录,然后是/home和/apps目录,先匹配这些目录下的文件,
然后再匹配其子目录中的文件,所有这些结果将通过管道传递给cpio命令进行备份。
顺便说一下,在上面的例子中cpio命令使用了C65536选项,我本可以使用B选项,不过这
样每块的大小只有 512 字节,而使用了C65536 选项后,块的大小变成了 64K 字节(65536 / 1024)。
使用 exec 或 ok 来执行 shell 命令
当匹配到一些文件以后,可能希望对其进行某些操作,这时就可以使用 -exec选项。
一旦find命令匹配到了相应的文件,就可以用 -exec选项中的命令对其进行操作
(在有些操作系统中只允许 -exec 选项执行诸如 ls 或 ls -l这样的命令)。
大多数用户使用这一选项是为了查找旧文件并删除它们。
这里我强烈地建议你在真正执行 rm 命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件。exec选项后面跟随着所要执行的命令,然后是一对儿{ },一个空格和一个\,最后是一个分号。为了使用 exec 选项,必须要同时使用 print 选项。
如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。
为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的 -exec选项中,例如:上面的例子中,find命令匹配到了当前目录下的所有普通文件,并在 -exec 选项中使用ls -l 命令将它们列出。
为了在 /logs目录中查找更改时间在5日以前的文件并删除它们,可以用:
$ find logs -type f -mtime +5 -exec rm {} \;记住,在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!当使用诸如 mv 或 rm 命令时,可以使用 -exec选项的安全模式。
它将在对每个匹配到的文件进行操作之前提示你。在下面的例子中, find 命令在当前目录中查找所有文件名以 .LOG 结尾、更改时间在5日以上的文件,并删除它们,
只不过在删除之前先给出提示。按y键删除文件,按n键不删除。
任何形式的命令都可以在 -exec 选项中使用。在下面的例子中我们使用 grep 命令。首先匹配所有文件名为 “passwd*”的文件,例如passwd、passwd.old、passwd.bak,
然后执行 grep 命令看看在这些文件中是否存在一个 rounder用户。find命令的例子
我们已经介绍了find命令的基本选项,下面给出find命令的一些其他的例子。
为了匹配 $HOME 目录下的所有文件,下面两种方法都可以使用:
$ find $HOME -print
$ find ~ -print为了在当前目录中查找 suid 置位,文件属主具有读、写、执行权限,并且文件所属组的用
户和其他用户具有读和执行的权限的文件,可以用:
$ find . -type f -perm 4755 -print为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径,可以用:
$ find / -type f -size 0 -exec ls -l {} \;为了查找 /var/logs 目录中更改时间在7日以前的普通文件,并删除它们,可以用:
$ find /var/logs -type f -mtime +7 -exec rm {} \;为了查找系统中所有属于 audit 组的文件,可以用:
$find /-name -group audit -print我们的一个审计系统每天创建一个审计日志文件。日志文件名的最后含有数字,
这样我们一眼就可以看出哪个文件是最新的,哪个是最旧的。
admin.log 文件编上了序号:admin.log.001、admin.log.002等等。下面的find命令将删除 /logs 目录中访问时间在7日以前、含有数字后缀的 admin.log 文件。
该命令只检查三位数字,所以相应日志文件的后缀不要超过 999。
$ find /logs -name 'admin.log[0-9][0-9]'[-0a-t9i]me +7 -exec rm {} \;为了查找当前文件系统中的所有目录并排序,可以用:
$ find . -type d -print -local -mount |sort为了查找系统中所有的r m t磁带设备,可以用:
$ find /dev/rmt -print
2. xargs
在使用 find 命令的 -exec 选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。
不幸的是,有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。
错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。
find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。
这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;而使用 xargs命令则只有一个进程。
另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,
以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
让我们来看看xargs命令是如何同find命令一起使用的,并给出一些例子。
下面的例子查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件:
下面的例子在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到
/tmp/core.log 文件中:
$ find . -name "core" -print | xargs echo "" >/tmp/core.log下面的例子在/apps/audit目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限:
$ find /apps/audit -perm -7 -print | xargs chmod o-w在下面的例子中,我们用grep命令在所有的普通文件中搜索device这个词:
$ find / -type f -print | xargs grep "device"在下面的例子中,我们用grep命令在当前目录下的所有普通文件中搜索DBO这个词:
$ find . -name *\-type f -print | xargs grep "DBO"
注意,在上面的例子中, \用来取消find命令中的*在shell中的特殊含义。
小结
find命令是一个非常优秀的工具,它可以按照用户指定的准则来匹配文件。使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。
3. locate 命令
locate,定位的意思,作用是让使用者可以快速的搜寻系统中是否有指定的文件。
命令功能:
locate命令可以在搜寻数据库时快速找到档案,数据库由updatedb程序来更新,updatedb是由cron daemon周期性建立的,locate命令在搜寻数据库时比由整个由硬盘资料来搜寻资料来得快,但较差劲的是locate所找到的档案若是最近才建立或 刚更名的,可能会找不到,在内定值中,updatedb每天会跑一次,可以由修改crontab来更新设定值。(etc/crontab)
locate指定用在搜寻符合条件的档案,它会去储存档案与目录名称的数据库内,寻找合乎范本样式条件的档案或目录录,可以使用特殊字元(如”*” 或”?”等)来指定范本样式,如指定范本为kcpa*ner, locate会找出所有起始字串为kcpa且结尾为ner的档案或目录,如名称为kcpartner若目录录名称为kcpa_ner则会列出该目录下包括 子目录在内的所有档案。
locate指令和find找寻档案的功能类似,但locate是透过update程序将硬盘中的所有档案和目录资料先建立一个索引数据库,在 执行loacte时直接找该索引,查询速度会较快,索引数据库一般是由操作系统管理,但也可以直接下达update强迫系统立即修改索引数据库。
locate命令用于查找文件,Locate可以很快速的搜寻档案系统内是否有指定的档案。其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了。所以它需要一个数据库(默认:slocate.db),一个配置文件(updatedb.conf),一个crontab(定时执行)
- 先运行updatedb, 可直接命令执行,也可以放在crontab里面执行
- 然后在生成的/var/lib/slocate/slocate.db数据库中查找。
所以
- locate的速度比find快,因为它并不是真的查找文件,而是查数据库
- locate的查找并不是实时的,而是以数据库的更新为准,一般是系统自己维护.
- locate的升级数据库命令:locate -- u #注意之间有空格
# ls -lart mlocate.db #更新前
-rw-r----- 1 root slocate 1286901 Aug 8 03:23 mlocate.db# updatedb //-->如果要查询最新的,建议更新数据库# ls -lart mlocate.db #更新后比更新前文件明显大些
-rw-r----- 1 root slocate 1296268 Aug 8 11:10 mlocate.db
locate 命令特点:
- 1) "locate"的速度比"find"快,因为它并不是真的查找文件,而是查数据库。
- 2) 新建的文件,我们立即用"locate"命令去查找,一般是找不到的,因为数据库的更新不是实时的,数据库的更新时间由系统维护。
- 3) "locate"命令所搜索的后台数据库在"/var/lib/mlocate"这个目录下,可能有些Linux系统位置不同,具体我们可以用"locate locate"查询。
- 4) 我们可以用"updatedb"命令来更新数据库,这样就能查询到刚才新建的文件了。
- 5) 并不是所有的目录下的文件都会用"locate"命令搜索到,"/etc/updatedb.conf"这个配置文件中,配置了一些"locate"命令的一些规则。
/etc/updatedb.conf 配置文件解析:
1) PRUNE_BIND_MOUNTS = "yes"
值为"yes"时开启搜索限制,此时,下边的配置生效;为"no"时关闭搜索限制。
2) PRUNEFS =
后边跟搜索时,不搜索的文件系统。
3) PRUNENAMES =
后边跟搜索时,不搜索的文件类型。
4) PRUNEPATHS =
后边跟搜索时,不搜索的文件所在的路径。
1. 命令格式:locate [选项] 文件名
2. 常用选项:
"locate -c" 查询指定文件的数目。(c为count的意思)
"locate -e" 只显示当前存在的文件条目。(e为existing的意思)
"locate -h" 显示"locate"命令的帮助信息。(h为help的意思)
"locate -i" 查找时忽略大小写区别。(i为ignore的意思)
"locate -n" 最大显示条数" 至多显示"最大显示条数"条查询到的内容。
"locate -r" 使用正则运算式做寻找的条件。(r为regexp的意思)
3. 常用范例:
1) 查找etc目录下所有以sh开头的文件
2) 查找etc目录下所有以sh开头的文件的数目
3) 查找etc目录下所有以sh开头的文件,并最多显示2条
4) 新建的文件,更新数据库后就能查询到了
5) 查找文件时,不区分大小写
6) 使用正则表达式,查找以akefile结尾的文件,并最多显示5条
7) 只显示当前存在的文件条目
# locate -S //-->查看统计信息,目录,文件,比特数适用情况
Database /var/lib/mlocate/mlocate.db:3,315 directories37,228 files1,504,439 bytes in file names594,851 bytes used to store database
# locate -V //-->查看版本信息
<pre name="code" class="plain">mlocate 0.22.2
Copyright (C) 2007 Red Hat, Inc. All rights reserved.
This software is distributed under the GPL v.2.
This program is provided with NO WARRANTY, to the extent permitted by law.
# locate -h //-->查看帮助信息
Usage: locate [OPTION]... [PATTERN]...
Search for entries in a mlocate database.-b, --basename match only the base name of path names-c, --count only print number of found entries-d, --database DBPATH use DBPATH instead of default database (which is/var/lib/mlocate/mlocate.db)-e, --existing only print entries for currently existing files-L, --follow follow trailing symbolic links when checking fileexistence (default)-h, --help print this help-i, --ignore-case ignore case distinctions when matching patterns-l, --limit, -n LIMIT limit output (or counting) to LIMIT entries-m, --mmap ignored, for backward compatibility-P, --nofollow, -H don't follow trailing symbolic links when checking fileexistence-0, --null separate entries with NUL on output-S, --statistics don't search for entries, print statistics about eachused database-q, --quiet report no error messages about reading databases-r, --regexp REGEXP search for basic regexp REGEXP instead of patterns--regex patterns are extended regexps-s, --stdio ignored, for backward compatibility-V, --version print version information-w, --wholename match whole path name (default)
# locate /etc/sh //-->查找/etc/sh*
/etc/shadow
/etc/shadow-
/etc/shadow.bup
/etc/shadow.bup.20140725-214324
/etc/shells
# locate -n 5 apache //-->只找带有apache目录,显示其中5行
/etc/selinux/targeted/modules/active/modules/apache.pp
/opt/ddd/oma/3rdparty/apache-tomcat
/opt/ddd/oma/3rdparty/apache-tomcat/LICENSE
/opt/ddd/oma/3rdparty/apache-tomcat/NOTICE
/opt/ddd/oma/3rdparty/apache-tomcat/RELEASE-NOTES
# locate -r makefile$ //-->查找结尾为makefile的文件目录
/usr/share/doc/bcel-5.2/verifier/GNUmakefile
# locate -n 3 -r ^\/opt //-->查找以/opt开头的目录,且只显示3行
/opt
/opt/ddd
/opt/sss
#locate -i /HTTP //-->查找/HTTP目录,忽略大小写
/usr/share/perl5/Net/HTTP/NB.pm
/usr/share/perl5/URI/http.pm
/usr/share/perl5/URI/https.pm
# locate -c httpd.conf //-->统计查找到的数量
3
# cat /etc/updatedb.conf //-->配置文件
PRUNE_BIND_MOUNTS = "yes"
PRUNEFS="9p afs anon_inodefs auto autofs bdev binfmt_misc cgroup cifs coda configfs cpuset debugfs devpts ecryptfs exofs fuse fusectl gfs gfs2 hugetlbfs inotifyfs iso9660 jffs2 lustre mqueue ncpfs nfs nfs4 nfsd pipefs proc ramfs rootfs rpc_pipefs securityfs selinuxfs sfs sockfs sysfs tmpfs ubifs udf usbfs efs100 lofs"
PRUNENAMES = ".git .hg .svn"
PRUNEPATHS = "/afs /media /net /sfs /tmp /udev /var/cache/ccache
/var/spool/cups /var/spool/squid /var/tmp"
PRUNEPATHS="/efs /efsroots"
export PRUNEPATHS