find命令详述

find命令是linux下面一个常用的命令,说它简单可以,说它复杂也可以。它有太多的参数,要完全掌握不容易,下面我就做个翻译,并附上范例,写写常用的参数。
一、基础
 首先要知道的是,find相当耗io资源,如果不是必要的话,建议用locate代替。
 find的命令格式如下:

find pathname -options
pathname 是要搜索的路径
-options 是可以增加的选项

  选项包括:
引用
-name
按照文件名查找文件,支持*号和[]号。
-perm
按照文件权限来查找文件,支持完全指定和-号、+号部分符合。
-prune
使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。
-user
按照文件属主来查找文件。
-group
按照文件所属的组来查找文件。
-mtime -n +n
按照文件的更改时间来查找文件
-amin -n +n
按照文件的访问时间来查找文件
-cmin -n +n
按照文件状态的更改时间来查找文件
※- n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。
-nogroup
查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
-nouser
查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
-newer file1 ! -newer file2
查找更改时间比文件file1新但比文件file2旧的文件。
-type
查找某一类型的文件,诸如:b - 块设备文件。d - 目录。c - 字符设备文件。p - 管道文件。l - 符号链接文件。f - 普通文件。
-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount:在查找文件时不跨越文件系统mount点。
-follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-regex pattern:对搜索结果的 整个路径按正规表达式进行过滤,必须对全路径考虑,例如结果是./test,那正规表达式应该用"./t.*",而不能用"t.*"
-cpio:对匹配的文件使用cpio命令。

 另外,在使用多个参数的时候,find命令还支持使用逻辑运算符:
引用
-a 类似&&,也就是与,当第一个参数运行为真,才运行后面的参数
-o 类似||,也就是或,当第一个运行为假,则运行后面的参数
!,也就是非、否


二、样例
$ find ~ -name "*.txt" -print

查找用户主目录下所有结尾是.txt的文件和目录等
$ find . -type f -perm 644 -print

显示当前目录下的所有权限是644的普通文件
$ find /var/logs -type f -mtime +7

显示/var/logs目录下,更改时间在7日前的文件
$ find /var/logs -amin +2 -amin -6

显示/var/logs目录下,2~6分钟前被访问过的文件。
$ find /var/logs -type f -daystart -mtime -1

查找/var/logs目录下,1天内被修改过的文件。而-daystart是假设原点为实际时间,而不是从当前推算的24小时方式计算。
$ find . -perm -7 -print

显示当前目录下权限为777的文件和目录等,-7表示用户、主、其他权限中都必须是7。
引用
-号表示权限要全包含,例如-4,则644、646、446都可以找到,但640就不会显示;
+号表示权限可以部分包含,例如+4,则644、644甚至640、404都会显示;

$ find /apps -path "/apps/bin" -prune -o -print

显示/apps目录中,除/apps/bin目录的所有文件和目录等;也就是当-path "/apps/bin"找到,则-prune,否则就-print,类似于:
引用
if -path "/usr/sam" then
         -prune
else
         -print

find /test /( -path /test/dir1 -o -path /test/file1 /) -prune -o -name "temp" -print

找/test目录下除了/test/dir1和/test/file1目录外的其他目录中的temp文件和目录等
$ find . -newer httpd1.conf ! -newer temp

找当前目录下比httpd1.conf新,但比temp旧的文件和目录等
$ find . ! -type d -print

找当前目录下除目录外的其他文件等(包括设备、链接文件)
$ find . -size +1000000c -print

显示当前目录文件大小超过1M字节的文件
$ find /home/linuxing -size 100c -print

找/home/linuxing目录下刚好100字节的文件
$ find . -size +10 -print

找当前目录下超过10个块的文件(1个块默认是512字节)
$ find / -name "test" -depth -print

按先找完起始目录,再进入子目录查找的方式找test文件
$ find . -name "test" -mount -print

找位于本文件系统上的当前目录中的test文件或目录等(不跨文件系统)

$ ls -l
total 2
-rw-r--r--  1 root  wheel   0 Dec 28 11:39 001
-rw-r--r--  1 root  wheel   0 Dec 28 11:39 002
-rw-r--r--  1 root  wheel  36 Dec 28 18:05 test
$ find . -name "00*" -regex "00.*"
$ find . -name "00*" -regex "./00.*"
./001
./002
$ find . -name "00*" -regex ".*0."
./001
./002

-regex 后面跟的是正规表达式,并且是对包括全路径的结果做过滤

三、配合参数-exec、-ok或xargs
 find命令可以使用-exec或-ok参数直接对结果执行操作,-exec或-ok后面跟执行的命令,然后是一对儿{},一个空格和一个,最后是一个分号。
 -exec和-ok的区别是-exec是不会咨询用户是否确认的,但-ok会要用户对操作进行每一步的确认。
 另外,由于部分系统能否接受的参数是有限制的,但-exec和-ok是把所有的结果作为整套参数传递,这会引起问题。所以也可以使用xargs配合达到同样的目的。在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
# find . -name "00*" -exec ls -l {} ;
-rw-r--r--  1 root  wheel  0 Dec 28 11:39 ./001
-rw-r--r--  1 root  wheel  0 Dec 28 11:39 ./002

对比上面命令的结果
# find . -name "00*" -ok rm {} ;
"rm ./001"? n
"rm ./002"? n
# find /etc -name "passwd*" -exec grep "linuxing" {} ;
linuxing:*:1010:1010:linuxing:/home/linuxing:/bin/bash

对比-exec和-ok的结果
# find . -type f -name "00*" |xargs file
./001: ASCII text
./002: empty

查找当前目录中开头是00的文件,并用file命令看看文件属性
# find . -perm 666 -print | xargs chmod o-w

再找到本地目录中有666权限的文件或目录等后,把other的w权限去掉
# find /etc -name "passwd*" |xargs grep "linuxing"
/etc/passwd:linuxing:*:1010:1010:linuxing:/home/linuxing:/bin/bash

对比xargs和-exec、-ok的使用方式和结果

四、注意
1、find的后面跟的参数需要注意顺序
因为find的参数之间可以省略-a,也就是说
find . -name "test*" -type f

find . -name "test*" -a -type f
是一样的。一旦配合-o等判断的时候,可能会引起难以发现的误会。
例如下面的命令:
find /test /(-path /test/dir1 -o -path /test/file1 /) -prune -o -name "temp" -print

2、find参数不只上述的这些,更多的请man看看。使用好find命令可以简化很多的操作,但同时find也是相当耗费资源的命令,需要慎用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`find` 命令是一个非常常用的 Linux 命令,用于在指定目录下查找文件。它的语法如下: ``` find [path] [expression] ``` 其中,`path` 参数指定要查找的目录,可以是相对路径或绝对路径。`expression` 参数用于指定查找的条件,例如文件名、文件类型、文件大小等等。 以下是一些常用的 `find` 命令示例: 1. 查找指定文件名的文件: ``` find /path/to/search -name "filename" ``` 例如,要在当前目录下查找名为 `test.txt` 的文件,可以使用以下命令: ``` find ./ -name "test.txt" ``` 2. 查找指定类型的文件: ``` find /path/to/search -type [f/d/l] ``` 其中,`f` 表示查找普通文件、`d` 表示查找目录、`l` 表示查找符号链接。 例如,要在当前目录下查找所有的目录,可以使用以下命令: ``` find ./ -type d ``` 3. 查找指定大小的文件: ``` find /path/to/search -size [+/-]size[c] ``` 其中,`+` 表示查找大于指定大小的文件,`-` 表示查找小于指定大小的文件,`size` 表示要查找的文件大小,`c` 表示单位为字节。 例如,要在当前目录下查找大小大于 1M 的文件,可以使用以下命令: ``` find ./ -size +1M ``` 4. 查找指定时间范围内修改过的文件: ``` find /path/to/search -mtime [+/-]n ``` 其中,`+` 表示查找修改时间在 n 天以前的文件,`-` 表示查找修改时间在 n 天以内的文件,`n` 表示天数。 例如,要在当前目录下查找 7 天以内修改过的文件,可以使用以下命令: ``` find ./ -mtime -7 ``` 以上是 `find` 命令的一些常用示例,还有很多其他的用法,可以通过 `man find` 命令查看 `find` 命令的手册页来了解更多信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值