由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统(NFS),find命令在该文件系统中同样有效,只你具有相应的权限。
在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。
1.1.1 Find命令形式
find pathname -options [-print -exec -ok]
1.1.2 Find命令参数
find命令选项options:
参数 | 说明 |
pathname | find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。 |
| find命令将匹配的文件输出到标准输出。 |
-exec | find命令对匹配的文件执行该参数所给出的s h e l l命令。相应命令的形式为' command' {} \;,注意{ }和\;之间的空格。 |
-ok | 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。 |
-name | 按照文件名查找文件。 |
-perm | 按照文件权限来查找文件。 |
-prune | 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。 |
-user | 按照文件属主来查找文件。 |
-group | 按照文件所属的组来查找文件。 |
-mtime | -mtime -n +n 按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。Find命令还有-atime和-ctime选项,但它们都和-mtime选项。 |
-nogroup | 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。 |
-nouser | 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。 |
-newer | -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命令,将这些文件备份到磁带设备中。 |
1.1.3 Find命令举例
1.1.3.1 name选项
文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。
可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。
不管当前路径是什么,如果想要在自己的根目录$HOME中查找文件名符合*.txt的文件,使用~作为pathname参数,波浪号~代表了你的$HOME目录。
$ find ~ -name "*.txt" -print
想要在当前目录及子目录中查找所有的*.txt文件,可以用:
$ find . -name "*.txt" –print
想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:
$ find . -name "[A-Z]*" –print
想要在/etc目录中查找文件名以host开头的文件,可以用:
$ find /etc -name "host*" -print
想要查找$HOME目录中的文件,可以用:
$ find ~ -name "*" -print 或find . -print
要想让系统高负荷运行,就从根目录开始查找所有的文件。
$ find / -name "*" -print
如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是*.txt的文件,下面的命令就能够返回名为ax37.txt的文件:
$find . -name "[a-z][a-z][0--9][0--9].txt" -print
1.1.3.2 perm选项
按照文件权限模式用-perm选项。
按文件权限模式来查找文件的话。最好使用八进制的权限表示法。
如在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:
$ find . -perm 755 -print
还有一种表达方法:在八进制数字前面要加一个横杠-,表示都匹配,如-007就相当于777,-006相当于666。
# ls -l
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 http3.conf
-rw-rw-rw- 1 sam adm 34890 10月 31 00:57 httpd1.conf
-rwxrwxr-x 2 sam adm 0 10月 31 01:01 httpd.conf
drw-rw-rw- 2 gem group 4096 10月 26 19:48 sam
-rw-rw-rw- 1 root root 2792 10月 31 20:19 temp
# find . -perm 006
# find . -perm -006
./sam
./httpd1.conf
./temp
1.1.3.3 prune选项
如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用-prune选项来指出需要忽略的目录。在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。
如果希望在/apps目录下查找文件,但不希望在/apps/bin目录下查找,可以用:
$ find /apps -path "/apps/bin" -prune -o -print
-perm选项中,我的解析还有一种表达方法:在八进制数字前面要加一个横杠-,表示都匹配,如-007就相当于777,-006相当于666。
使用find查找文件的时候怎么避开某个文件目录?
比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件
$find /usr/sam -path "/usr/sam/dir1" -prune -o -print
find [path ..] [expression] 在路径列表的后面的是表达式
-path "/usr/sam" -prune -o -print 是 -path "/usr/sam" -a -prune -o -print 的简写表达式按顺序求值, -a 和 -o 都是短路求值,与 shell 的 && 和 || 类似。如果 -path "/usr/sam" 为真,则求值 -prune , -prune 返回真,与逻辑表达式为真;否则不求值 -prune ,与逻辑表达式为假。 如果 -path "/usr/sam" -a -prune 为假,则求值 -print ,-print 返回真,或逻辑表达式为真;否则不求值 -print,或逻辑表达式为真。
这个表达式组合特例可以用伪码写为
if -path "/usr/sam" then
-prune
else