每天一个Linux命令(19):find

来源:互联网 发布:成都办公软件培训中心 编辑:程序博客网 时间:2024/05/06 14:35

find可用于在目录中查找文件,并执行指定操作。find提供了许多查找条件,功能很强大。由于find强大的功能,所以它的选项也很多,其中的大部分值得我们花时间来了解。即使操作系统中含有网络文件系统( NFS),只要你具有相应的权限,find在NFS中同样有效。 在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里指30GB以上的文件系统)。

1. 命令格式

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

2. 命令功能

用于在文件树种查找文件,并作出相应的处理

3. 命令参数

pathname,查找的目录路径。例如,用.表示当前目录,用/表示系统根目录。

-print,将匹配到的文件输出到标准输出。

-exec, find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为’command’ { } ;,注意{ }和;之间的空格。

-ok,与-exec的作用相同,只不过以一种更为安全的模式来执行参数所给出的shell命令:在执行每一个命令之前,都会给出一个提示,让用户来确定是否执行。

4. 命令选项

-name,按照文件名查找文件。

-perm,按照文件权限来查找文件。

-prune,使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。

-user,按照文件属主来查找文件。

-group,按照文件的属组来查找文件。

-mtime -n/+n,按照文件的更改时间来查找文件,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。

-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:在查找文件时不跨越文件系统挂载点。

-follow:如果遇到符号链接文件,就跟踪至链接所指向的文件。

-cpio:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。

另外,下面三个的区别:

  • -amin n,查找最后N分钟访问的文件
    -atime n,查找最后n*24小时访问的文件

  • -cmin n,查找最后N分钟被改变状态的文件
    -ctime n,查找最后n*24小时被改变状态的文件

  • -mmin n,查找最后N分钟被改变数据的文件
    -mtime n,查找最后n*24小时被改变数据的文件

5. 使用实例

例一:查找指定时间内修改过的文件

命令:find -atime -2

# find -atime -2       // 查找48小时内修改过的文件../logs/monitor./.bashrc./.bash_profile./.bash_history


例二:根据关键字查找

命令:find . -name "*.log"

# find . -name "*.log"      // 在当前目录查找以.log结尾的文件./log_link.log./log2014.log./test4/log3-2.log./test4/log3-3.log./test4/log3-1.log./log2013.log./log2012.log./log.log./test5/log5-2.log./test5/log5-3.log./test5/log.log./test5/log5-1.log./test5/test3/log3-2.log./test5/test3/log3-3.log./test5/test3/log3-1.log./test3/log3-2.log./test3/log3-3.log./test3/log3-1.log


例三:按照目录或文件的权限来查找文件

命令:find /test/ -perm 777

# find /test/ -perm 777          // 在/test/目录下,查找权限为777的文件/opt/soft/test/log_link.log/opt/soft/test/test4/opt/soft/test/test5/test3/opt/soft/test/test3


例四:按类型查找

命令:find . -type f -name "*.log"

# find . -type f -name "*.log"  // 在当前目录,查找以.log结尾的普通文件./log2014.log./test4/log3-2.log./test4/log3-3.log./test4/log3-1.log./log2013.log./log2012.log./log.log./test5/log5-2.log./test5/log5-3.log./test5/log.log./test5/log5-1.log./test5/test3/log3-2.log./test5/test3/log3-3.log./test5/test3/log3-1.log./test3/log3-2.log./test3/log3-3.log./test3/log3-1.log


例五:在当前路径下,将所有目录排序

命令:find . -type d | sort

# find . -type d | sort../scf./scf/bin./scf/doc./scf/lib./scf/service./scf/service/deploy./scf/service/deploy/info./scf/service/deploy/product./test3./test4./test5./test5/test3


例六:按大小查找文件

命令:find . -size +1000c -print

#  find . -size +1000c -print       //在当前目录,查找大于1K的文件../test4./scf./scf/lib./scf/service./scf/service/deploy./scf/service/deploy/product./scf/service/deploy/info./scf/doc./scf/bin./log2012.log./test5./test5/test3./test3

6. find命令之exec

-exec参数后面跟的是所要执行的命令或脚本,它以;为终止标志,所以命令后面的分号不可缺少。考虑到不同系统中分号会有不同的意义,所以分号前面加反斜杠。花括号{}代表前面find查找出来的文件名。

使用find时,只要把想要的操作写在一个脚本里,就可以用exec配合查找,很方便。在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令,大多数用户使用这一选项是为了查找旧文件并删除它们。

例七:ls -l放在-exec选项后

命令:find . -type f -exec ls -l {} \;

# find . -type f -exec ls -l {} \; -rw-r--r-- 1 root root 127 10-28 16:51 ./log2014.log-rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-2.log-rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-3.log-rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-1.log-rw-r--r-- 1 root root 33 10-28 16:54 ./log2013.log-rw-r--r-- 1 root root 302108 11-03 06:19 ./log2012.log-rw-r--r-- 1 root root 25 10-28 17:02 ./log.log-rw-r--r-- 1 root root 37 10-28 17:07 ./log.txt-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-2.log-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-3.log-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-1.log

说明: 上面的例子中,find命令匹配到了当前目录下的所有普通文件,并在-exec选项中使用ls -l命令将它们列出。

例八:在当前目录中,查找更改时间在n日以前的文件,并删除它们

命令:find . -type f -mtime +14 -exec rm {} \;

# ll总计 328-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log-rw-r--r-- 1 root root     33 10-28 16:54 log2013.log-rw-r--r-- 1 root root    127 10-28 16:51 log2014.loglrwxrwxrwx 1 root root      7 10-28 15:18 log_link.log -> log.log-rw-r--r-- 1 root root     25 10-28 17:02 log.log-rw-r--r-- 1 root root     37 10-28 17:07 log.txtdrwxr-xr-x 6 root root   4096 10-27 01:58 scfdrwxrwxrwx 2 root root   4096 10-28 14:47 test3drwxrwxrwx 2 root root   4096 10-28 14:47 test4# find . -type f -mtime +14 -exec rm {} \;# ll总计 312-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.loglrwxrwxrwx 1 root root      7 10-28 15:18 log_link.log -> log.logdrwxr-xr-x 6 root root   4096 10-27 01:58 scfdrwxrwxrwx 2 root root   4096 11-12 19:32 test3drwxrwxrwx 2 root root   4096 11-12 19:32 test4

说明:在shell中,用任何方式删除文件之前,应当先查看相应的文件。当使用诸如mv或rm命令时,可以使用-exec选项的安全模式-ok,在对匹配到的每个文件进行操作之前,它提示你。

例九:在当前目录中,查找更改时间在n日以前的文件并删除它们,要给出提示

命令:find . -name "*.log" -mtime +5 -ok rm {} \;

# ll总计 312-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.loglrwxrwxrwx 1 root root      7 10-28 15:18 log_link.log -> log.logdrwxr-xr-x 6 root root   4096 10-27 01:58 scfdrwxrwxrwx 2 root root   4096 11-12 19:32 test3drwxrwxrwx 2 root root   4096 11-12 19:32 test4# find . -name "*.log" -mtime +5 -ok rm {} \;< rm ... ./log_link.log > ? y< rm ... ./log2012.log > ? n# ll总计 312-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.logdrwxr-xr-x 6 root root   4096 10-27 01:58 scfdrwxrwxrwx 2 root root   4096 11-12 19:32 test3drwxrwxrwx 2 root root   4096 11-12 19:32 test4

说明:在上面的例子中, find命令在当前目录中查找所有文件名以.log结尾、更改时间在5日以上的文件,并删除它们,在删除之前给出提示。 按y键删除文件,按n键不删除。

例十:用exec选项执行grep命令

命令:find /etc -name "passwd*" -exec grep "root" {} \;

# find /etc -name "passwd*" -exec grep "root" {} \;root:x:0:0:root:/root:/bin/bashroot:x:0:0:root:/root:/bin/bash

说明:任何形式的命令都可以在-exec选项中使用,在上面的例子中我们使用grep命令。find命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令,查看这些文件中是否存在一个root用户。

例十一:查找文件移动到指定目录

命令:find . -name "*.log" -exec mv {} .. \;

# ll总计 304-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log-rw-r--r-- 1 root root     61 11-12 22:44 log2013.log-rw-r--r-- 1 root root      0 11-12 22:25 log2014.log# find . -name "*.log" -exec mv {} .. \;# ll总计 0# cd ..# ll总计 316-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log-rw-r--r-- 1 root root     61 11-12 22:44 log2013.log-rw-r--r-- 1 root root      0 11-12 22:25 log2014.logdrwxr-xr-x 6 root root   4096 10-27 01:58 scfdrwxrwxr-x 2 root root   4096 11-12 22:50 test3drwxrwxr-x 2 root root   4096 11-12 19:32 test4


例十二:用exec选项执行cp命令

命令:find . -name "*.log" -exec cp {} test3 \;

# ll总计 316-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log-rw-r--r-- 1 root root     61 11-12 22:44 log2013.log-rw-r--r-- 1 root root      0 11-12 22:25 log2014.logdrwxr-xr-x 6 root root   4096 10-27 01:58 scfdrwxrwxr-x 2 root root   4096 11-12 22:50 test3drwxrwxr-x 2 root root   4096 11-12 19:32 test4# find . -name "*.log" -exec cp {} test3 \;cp: “./test3/log2014.log” 及 “test3/log2014.log” 为同一文件cp: “./test3/log2013.log” 及 “test3/log2013.log” 为同一文件cp: “./test3/log2012.log” 及 “test3/log2012.log” 为同一文件# cd test3# ll总计 304-rw-r--r-- 1 root root 302108 11-12 22:54 log2012.log-rw-r--r-- 1 root root     61 11-12 22:54 log2013.log-rw-r--r-- 1 root root      0 11-12 22:54 log2014.log

7. find命令之xargs

在使用-exec选项匹配文件时, find命令将所有匹配到的文件传递给-exec执行。但有些系统对传递给-exec的命令长度有限制,如果超出,命令在运行几分钟之后会出现溢出错误,错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs可以避免这个问题。

find将匹配到的文件传递给xargs,而xargs不会像-exec那样得到全部,而是只获取一部分文件,这样它可以先处理最先获取的一部分文件,然后是下一批,并继续下去。

在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,而不是将匹配到的文件一次执行,如果匹配到的文件数量大,就会出现进程过多和系统性能下降的问题,因而效率不高。而使用xargs选项只有一个进程。另外,使用xargs,是一次性获取所有参数,还是分批取得参数,以及每一次获取参数的数目,都可根据选项和系统内核中相应的可调参数来确定。

例十三: 查找系统中所有的普通文件,然后使用xargs查看它们分别属于哪类文件

命令:find . -type f -print | xargs file

# ll总计 312-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log-rw-r--r-- 1 root root      0 11-12 22:25 log2013.log-rw-r--r-- 1 root root      0 11-12 22:25 log2014.logdrwxr-xr-x 6 root root   4096 10-27 01:58 scfdrwxrwxrwx 2 root root   4096 11-12 19:32 test3drwxrwxrwx 2 root root   4096 11-12 19:32 test4# find . -type f -print | xargs file./log2014.log: empty./log2013.log: empty./log2012.log: ASCII text


例十四:在整个系统中查找内存信息转储文件(core dump) ,并把结果保存到/tmp/core.log

命令:find / -name "core" -print | xargs echo "" > /tmp/core.log

# find / -name "core" -print | xargs echo "" >/tmp/core.log# cd /tmp# ll总计 16-rw-r--r-- 1 root root 1524 11-12 22:29 core.logdrwx------ 2 root root 4096 11-12 22:24 ssh-TzcZDx1766drwx------ 2 root root 4096 11-12 22:28 ssh-ykiRPk1815drwx------ 2 root root 4096 11-03 07:11 vmware-root


例十五:在当前目录下,查找所有读、写和执行权限的文件,并收回相应的写权限

命令:find . -perm -7 -print | xargs chmod o-w

# ll总计 312-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log-rw-r--r-- 1 root root      0 11-12 22:25 log2013.log-rw-r--r-- 1 root root      0 11-12 22:25 log2014.logdrwxr-xr-x 6 root root   4096 10-27 01:58 scfdrwxrwxrwx 2 root root   4096 11-12 19:32 test3drwxrwxrwx 2 root root   4096 11-12 19:32 test4# find . -perm -7 -print | xargs chmod o-w# ll总计 312-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log-rw-r--r-- 1 root root      0 11-12 22:25 log2013.log-rw-r--r-- 1 root root      0 11-12 22:25 log2014.logdrwxr-xr-x 6 root root   4096 10-27 01:58 scfdrwxrwxr-x 2 root root   4096 11-12 19:32 test3drwxrwxr-x 2 root root   4096 11-12 19:32 test4

说明:执行命令后,文件夹test3和test4的权限发生改变

例十六:在所有的普通文件中,用grep搜索hostname这个词

命令:find . -type f -print | xargs grep "hostname"

# find . -type f -print | xargs grep "hostname"./log2013.log:hostnamebaidu=baidu.com./log2013.log:hostnamesina=sina.com./log2013.log:hostnames=true[root@localhost test]#


例十七:在当前目录的所有普通文件中,用grep搜索hostnames这个词

命令:find . -name \* -type f -print | xargs grep "hostnames"

# find . -name \* -type f -print | xargs grep "hostnames"./log2013.log:hostnamesina=sina.com./log2013.log:hostnames=true[root@localhost test]#

说明:在上面的例子中, 用\取消*在shell中的特殊含义。

例十八:使用xargs执行mv

命令:find . -name "*.log" | xargs -i mv {} test4

# ll总计 316-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log-rw-r--r-- 1 root root     61 11-12 22:44 log2013.log-rw-r--r-- 1 root root      0 11-12 22:25 log2014.logdrwxr-xr-x 6 root root   4096 10-27 01:58 scfdrwxrwxr-x 2 root root   4096 11-12 22:54 test3drwxrwxr-x 2 root root   4096 11-12 19:32 test4# cd test4/# ll总计 0# cd ..# find . -name "*.log" | xargs -i mv {} test4# ll总计 12drwxr-xr-x 6 root root 4096 10-27 01:58 scfdrwxrwxr-x 2 root root 4096 11-13 05:50 test3drwxrwxr-x 2 root root 4096 11-13 05:50 test4# cd test4/# ll总计 304-rw-r--r-- 1 root root 302108 11-12 22:54 log2012.log-rw-r--r-- 1 root root     61 11-12 22:54 log2013.log-rw-r--r-- 1 root root      0 11-12 22:54 log2014.log


例十九:find后执行xargs,提示xargs: argument line too long

命令:find . -type f -atime +0 -print | xargs -0 -l1 -t rm -f

说明:-l1是一次处理一个,-t是处理之前打印出命令。

例二十:find命令的输出可以用{}表示,也可以用-I参数指定其他代替字符,如[] 。另外,-i等价于-I {}

# ll总计 12drwxr-xr-x 6 root root 4096 10-27 01:58 scfdrwxrwxr-x 2 root root 4096 11-13 05:50 test3drwxrwxr-x 2 root root 4096 11-13 05:50 test4# cd test4# ll总计 304-rw-r--r-- 1 root root 302108 11-12 22:54 log2012.log-rw-r--r-- 1 root root     61 11-12 22:54 log2013.log-rw-r--r-- 1 root root      0 11-12 22:54 log2014.log# find . -name "*.log" | xargs -I [] cp [] ..# cd ..# ll总计 316-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log-rw-r--r-- 1 root root     61 11-13 06:03 log2013.log-rw-r--r-- 1 root root      0 11-13 06:03 log2014.logdrwxr-xr-x 6 root root   4096 10-27 01:58 scfdrwxrwxr-x 2 root root   4096 11-13 05:50 test3drwxrwxr-x 2 root root   4096 11-13 05:50 test4


例二十一:使用-p参数

命令:find . -name "*.log" | xargs -p -i mv {} ..
说明:-p参数会提示你,是否确认执行后面的命令,其中选择y执行,n不执行。

# ll总计 316-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log-rw-r--r-- 1 root root     61 11-13 06:03 log2013.log-rw-r--r-- 1 root root      0 11-13 06:03 log2014.logdrwxr-xr-x 6 root root   4096 10-27 01:58 scfdrwxrwxr-x 2 root root   4096 11-13 06:06 test3drwxrwxr-x 2 root root   4096 11-13 05:50 test4# cd test3# find . -name "*.log" | xargs -p -i mv {} ..mv ./log2015.log .. ?...y# ll总计 0# cd ..# ll总计 316-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log-rw-r--r-- 1 root root     61 11-13 06:03 log2013.log-rw-r--r-- 1 root root      0 11-13 06:03 log2014.log-rw-r--r-- 1 root root      0 11-13 06:06 log2015.logdrwxr-xr-x 6 root root   4096 10-27 01:58 scfdrwxrwxr-x 2 root root   4096 11-13 06:08 test3drwxrwxr-x 2 root root   4096 11-13 05:50 test4

8. find命令之参数详解

下面我们将要了解find命令的一些常用参数,一些常用选项,一些具体用法和注意事项。

例二十二:使用name选项

文件名是find最常用的选项,可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。

find ~ -name "*.log" -print  //不管当前路径是什么,波浪号~代表了你的$HOME目录

在当前目录及其子目录,查找所有‘ *.log’文件

find . -name "*.log" -print  

在当前目录及其子目录,查找一个以大写字母开头的文件

find . -name "[A-Z]*" -print  

在/etc目录,查找以host开头的文件

find /etc -name "host*" -print  

查找$HOME目录中的文件

find ~ -name "*" -print或find . -print  

从根目录查找所有的文件

find  /  -name "*"  -print  

在当前目录,查找一个以小写字母开头,以4至9结尾,扩展名是.log的文件

# ll总计 316-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log-rw-r--r-- 1 root root     61 11-13 06:03 log2013.log-rw-r--r-- 1 root root      0 11-13 06:03 log2014.log-rw-r--r-- 1 root root      0 11-13 06:06 log2015.logdrwxr-xr-x 6 root root   4096 10-27 01:58 scfdrwxrwxr-x 2 root root   4096 11-13 06:08 test3drwxrwxr-x 2 root root   4096 11-13 05:50 test4# find . -name "[a-z]*[4-9].log" -print./log2014.log./log2015.log./test4/log2014.log


例二十三:使用perm选项

按权限模式来查找文件,使用-perm选项,最好使用八进制的权限表示法。

在当前目录下,查找权限为755的文件

# find . -perm 755 -print../scf./scf/lib./scf/service./scf/service/deploy./scf/service/deploy/product./scf/service/deploy/info./scf/doc./scf/bin

另一种表达方法:在八进制数字前加一个横杠-,表示都匹配。如-007就相当于777,-005相当于555。

# ll总计 316-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log-rw-r--r-- 1 root root     61 11-13 06:03 log2013.log-rw-r--r-- 1 root root      0 11-13 06:03 log2014.log-rw-r--r-- 1 root root      0 11-13 06:06 log2015.logdrwxr-xr-x 6 root root   4096 10-27 01:58 scfdrwxrwxr-x 2 root root   4096 11-13 06:08 test3drwxrwxr-x 2 root root   4096 11-13 05:50 test4# find . -perm -005../test4./scf./scf/lib./scf/service./scf/service/deploy./scf/service/deploy/product./scf/service/deploy/info./scf/doc./scf/bin./test3


例二十四:使用find查找文件时,如何避开某个目录

说明:find [-path ..] [expression]

-path “test” -prune -o -print 是 -path “test” -a -prune -o -print 的简写,表达式按顺序求值,-a类似于&&(与),-o类似于||(或)。如果-path “test” 为真,则求值 -prune,与表达式为真;如果-path “test” 为假,则不求值-prune,与表达式为假。如果-path “test” -a -prune为假,则求值-print,若-print返回真,则或表达式为真;若-print返回假,则或表达式为假。

这个表达式组合特例可以用伪码写为:

if -path "test" then  -prune  else  -print  

在使用-prune选项时要当心,如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。

  • 避开多个文件夹
# find test \(-path test/test4 -o -path test/test3 \) -prune -o -printtesttest/log2014.logtest/log2015.logtest/scftest/scf/libtest/scf/servicetest/scf/service/deploytest/scf/service/deploy/producttest/scf/service/deploy/infotest/scf/doctest/scf/bintest/log2013.logtest/log2012.log

说明:圆括号表示表达式的结合。\表示引用,即指示shell不对后面的字符作特殊解释,而留给find命令去解释其意义。

  • 查找某一确定文件,-name等选项加在-o 之后
# find test \( -path test/test4 -o -path test/test3 \) -prune -o -name "*.log" -printtest/log2014.logtest/log2015.logtest/log2013.logtest/log2012.log


例二十五:使用user和nouser选项

  • 在$HOME目录中,查找文件属主为peida的文件

命令:`find ~ -user peida -print

  • 在/etc目录下,查找文件属主为peida的文件

命令:find /etc -user peida -print

  • 为了查找属主帐户已经被删除的文件,可以使用-nouser选项。在/home目录下查找所有的这类文件

命令:find /home -nouser -print

说明:在某个目录下,找到无有效属主(在/etc/passwd文件中没有注册)的文件。在使用-nouser选项时,我们不必给出用户名, find会完成相应的工作。

例二十六:使用group和nogroup选项

就像user和nouser一样,针对文件的属组, find也具有同样的选项。

  • 在/apps目录下,查找属于gem属组的文件
find /apps -group gem -print  
  • 查找没有有效属组的所有文件,可以使用nogroup选项。下面的find命令从文件系统的根目录处查找这样的文件
find / -nogroup -print


例二十七:按照更改时间或访问时间查找文件

如果希望按照更改时间来查找文件,可以使用mtime,atime或ctime选项。如果系统突然没有可用空间了,很有可能是某个文件的长度迅速增长,这时可以用mtime选项来查找文件。减号-来限定更改时间在距今n日以后的文件,而加号+来限定更改时间在距今n日以前的文件。

  • 在系统根目录下,查找更改时间在5日以后的文件
find / -mtime -5 -print
  • 在/var/adm目录下,查找更改时间在3日以前的文件
find /var/adm -mtime +3 -print


例二十八:查找比某个文件新或旧的文件

  • 查找更改时间比文件log2012.log新,但比文件log2017.log旧的文件

命令:find -newer log2012.log ! -newer log2017.log

说明:-newer newest_file_name ! oldest_file_name,其中!是逻辑非符号

# ll总计 316-rw-r--r-- 1 root root 302108 11-13 06:03 log2012.log-rw-r--r-- 1 root root     61 11-13 06:03 log2013.log-rw-r--r-- 1 root root      0 11-13 06:03 log2014.log-rw-r--r-- 1 root root      0 11-13 06:06 log2015.log-rw-r--r-- 1 root root      0 11-16 14:41 log2016.log-rw-r--r-- 1 root root      0 11-16 14:43 log2017.logdrwxr-xr-x 6 root root   4096 10-27 01:58 scfdrwxrwxr-x 2 root root   4096 11-13 06:08 test3drwxrwxr-x 2 root root   4096 11-13 05:50 test4# find -newer log2012.log ! -newer log2017.log../log2015.log./log2017.log./log2016.log./test3


例二十九:查找更改时间在比log2012.log新的文件

命令:find . -newer log2012.log -print

# find -newer log2012.log -print../log2015.log./log2017.log./log2016.log./test3


例三十:使用type选项

  • 在/etc目录下查找所有的目录

命令:find /etc -type d -print

  • 在当前目录下,查找除目录以外的所有类型的文件

命令:find . ! -type d -print

  • 在/etc目录下,查找所有的符号链接文件

命令: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命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。

  • 从文件系统的根目录开始,查找一个名为CON.FILE的文件。

命令:find / -name "CON.FILE" -depth -print

说明:首先,它将匹配所有的文件,然后再进入子目录查找

例三十三:使用mount选项

使用find命令的mount选项,在当前文件系统中查找文件(不进入其他文件系统)。

  • 从当前目录查找,以XC结尾的文件

命令:find . -name "*.XC" -mount -print

0 0
原创粉丝点击