Linux——Find(二)

前言

F i n d 是一个非常有效的工具,它可
以遍历当前目录甚至于整个文件系统来查找某些文件或目录。

表达式

F i n d 命令的一般形式为:

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

让我们来看看该命令的参数:

  • pathname find命令所查找的目录路径。例如用 .来表示当前目录,用/来表示系统根目录。
  • -print find命令将匹配的文件输出到标准输出。
  • -exec find命令对匹配的文件执行该参数所给出的 s h e l l命令。相应命令的形式为 ‘ c o m m -
    and’ {} ;,注意{ }和\;之间的空格。
  • -ok 和- e x e c的作用相同,只不过以一种更为安全的模式来执行该参数所给出的 s h e l l命令,
    在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

命令选项

find 命令有很多选项或表达式,每一个选项前面跟随一个横杠 -。让我们先来看一下该命令的主要选项,然后再给出一些例子。

  • -name 按照文件名查找文件。
  • -perm 按照文件权限来查找文件。
  • -prune 使用这一选项可以使f i n d命令不在当前指定的目录中查找,如果同时使用了 - d e p t h
    选项,那么- p r u n e选项将被f i n d命令忽略。
  • -user 按照文件属主来查找文件。
  • -group 按照文件所属的组来查找文件。
  • -mtime -n +n 按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n
    表示文件更改时间距现在 n天以前。F i n d命令还有- a t i m e和- c t i m e选项,但它们都和- m t i m e选项相似,所以我们在这里只介绍 - m t i m e选项。
  • -nogroup 查找无有效所属组的文件,即该文件所属的组在 / e t c / g r o u p s中不存在。
  • -nouser 查找无有效属主的文件,即该文件的属主在 / e t c / p a s s w d中不存在。
  • -newer file1 ! file2 查找更改时间比文件f i l e 1新但比文件f i l e 2旧的文件。
  • -type 查找某一类型的文件,诸如:
    b - 块设备文件。
    d - 目录。
    c - 字符设备文件。
    p - 管道文件。
    l - 符号链接文件。
    f - 普通文件。
  • -size n[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
  • -depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
  • -fstype 查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件
    / e t c / f s t a b中找到,该配置文件中包含了本系统中有关文件系统的信息。
  • -mount 在查找文件时不跨越文件系统 m o u n t点。
  • -follow 如果f i n d命令遇到符号链接文件,就跟踪至链接所指向的文件。
  • -cpio 对匹配的文件使用c p i o命令,将这些文件备份到磁带设备中。

使用name选项

不管当前路径是什么,如果想要在自己的根目录 $ H O M E中查找文件名符合 * . t x t的文件,使用作为’ p a t h n a m e参数,波浪号代表了你的$ H O M E目录。

$ find ~ -name “*.txt” -print

或:

$ find . -print

想要在当前目录及子目录中查找所有的‘ * . t x t’文件,可以用:

$ find . -name “*.txt” -print

想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:

$ find . -name “[A-Z]*” -print

想要在 /etc 目录中查找文件名以 host 开头的文件,可以用:

$ find /etc -name “host*” -print

要想让系统高负荷运行,就从根目录开始查找所有的文件。如果希望在系统管理员那里保留一个好印象的话,最好在这么做之前考虑清楚!

$ find / -name “*” -print

如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是 * . t x t的文件,下面的命令就能够返回名为 a x 3 7 . t x t的文件:

$ find . -name “[a-z][a-z][0–9][0–9].txt” -print

使用perm选项

如果希望按照文件权限模式来查找文件的话,可以采用 - p e r m选项。

为了在当前目录下查找文件权限位为 7 5 5的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:

$ find . -perm 755 -print

如果希望在当前目录下查找所有用户都可读、写、执行的文件(要小心这种情况),我们可以使用f i n d命令的- p e r m选项。在八进制数字前面要加一个横杠 -。在下面的命令中 - p e r m代表按照文件权限查找,而‘ 0 0 7’和你在c h m o d命令的绝对模式中所采用的表示法完全相同。

$ find . -perm -007 -print

忽略某个目录

可以使用- p r u n e选项来指出需要忽略的目录。在使用 - p r u n e选项时要当心,因为如果你同时使用了- d e p t h选项,那么- p r u n e选项就会被f i n d命令忽略。

如果希望在/ a p p s目录下查找文件,但不希望在 / a p p s / b i n目录下查找,可以用:

$ find /apps -name “/apps/bin” -prune -o -print

使用user和nouser选项

如果希望按照文件属主查找文件,可以给出相应的用户名。例如,在 $ H O M E目录中查找文件属主为d a v e的文件,可以用:

$ find ~ -user dave -print

在/ e t c目录下查找文件属主为u u c p的文件:

$ find /etc -user uucp -print

为了查找属主帐户已经被删除的文件,可以使用 - n o u s e r选项。

$ find /home -nouser -print

使用group和nogroup选项

就像u s e r和n o u s e r选项一样,针对文件所属于的用户组, f i n d命令也具有同样的选项,为了在/ a p p s目录下查找属于a c c t s用户组的文件,可以用:

$ find /apps -group accts -print

要查找没有有效所属用户组的所有文件,可以使用 n o g r o u p选项。下面的f i n d命令从文件系统的根目录处查找这样的文件:

$ fine/-nogroup-print

按照更改时间查找文件

如果希望按照更改时间来查找文件,可以使用 m t i m e选项。

希望在系统根目录下查找更改时间在 5日以内的文件,可以用:

$ find / -mtime -5 -print

为了在/ v a r / a d m目录下查找更改时间在3日以前的文件,可以用:

$ find /var/adm -mtime +3 -print

使用type选项

如果要在 / e t c目录下查找所有的目录,可以用:

$ find /etc -type d -print

为了在当前目录下查找除目录以外的所有类型的文件,可以用:

$ find . ! -type d -print

为了在/ e t c目录下查找所有的符号链接文件,可以用:

$ find /etc -type l -print

使用size选项

可以按照文件长度来查找文件,这里所指的文件长度既可以用块( b l o c k)来计量,也可以用字节来计量。

以字节计量文件长度的表达形式为 N c;以块计量文件长度只用数字表示即可。

为了在当前目录下查找文件长度大于 1 M字节的文件,可以用:

$ find . -size +1000000c -print

为了在/ h o m e / a p a c h e目录下查找文件长度恰好为 1 0 0字节的文件,可以用:

$ find /home/apache -size 100c -print

为了在当前目录下查找长度超过 1 0块的文件(一块等于5 1 2字节),可以用:

$ find . -size +10 -print

使用depth选项

在使用f i n d命令时,可能希望先匹配所有的文件,再在子目录中查找。使用 d e p t h选项就可以使f i n d命令这样做。这样做的一个原因就是,当在使用 f i n d命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。

在下面的例子中, f i n d命令从文件系统的根目录开始,查找一个名为 C O N . F I L E的文件。
它将首先匹配所有的文件然后再进入子目录中查找。

$ find / -name “CON.FILE” -depth -print

使用mount选项

在当前的文件系统中查找文件(不进入其他文件系统),可以使用f i n d命令的m o u n t选项。

在下面的例子中,我们从当前目录开始查找位于本文件系统中文件名以 X C结尾的文件:

$ find . -name “*.XC” -mount -print

使用cpio选项

c p i o命令可以用来向磁带设备备份文件或从中恢复文件。

find etc home apps -depth -print | cpio -ivcdC65536 -o /dev/rmt0

使用exec或ok来执行shell命令

当匹配到一些文件以后,可能希望对其进行某些操作,这时就可以使用 - e x e c选项。

e x e c选项后面跟随着所要执行的命令,然后是一对儿 { },一个空格和一个 \,最后是一个
分号。

为了用ls -l命令列出所匹配到的文件,可以把 ls -l命令放在f i n d命令的- e x e c选项中,例如:

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

当使用诸如m v或r m命令时,可以使用-ok 选项的安全模式。

它将在对每个匹配到的文件进行操作之前提示你。

find . -name “*.log” -mtime +5 -ok rm {} \ ;

xargs

在使用f i n d命令的- e x e c选项处理匹配到的文件时, f i n d命令将所有匹配到的文件一起传递给e x e c执行。

不幸的是,有些系统对能够传递给 e x e c的命令长度有限制,这样在 f i n d命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。

这就是x a rg s命令的用处所在,特别是与 f i n d命令一起使用。 F i n d命令把匹配到的文件传递给 x a rg s命令,而x a rg s命令每次只获取一部分文件而不是全部,不像 - e x e c选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

下面的例子在整个系统中查找内存信息转储文件 (core dump) ,然后把结果保存到/tmp/core.log 文件中:

$ find . -name “core” -print | xargs echo “” >/tmp/core.log

文章目录
  1. 1. 前言
  2. 2. 表达式
  3. 3. 命令选项
  4. 4. 使用name选项
  5. 5. 使用perm选项
  6. 6. 忽略某个目录
  7. 7. 使用user和nouser选项
  8. 8. 使用group和nogroup选项
  9. 9. 按照更改时间查找文件
  10. 10. 使用type选项
  11. 11. 使用size选项
  12. 12. 使用depth选项
  13. 13. 使用mount选项
  14. 14. 使用cpio选项
  15. 15. 使用exec或ok来执行shell命令
  16. 16. xargs
|