Unix/命令/查找文件指南
在给定路径中搜索文件或文件夹。语法为:find [path...] [expression...]
示例: 在一些最新的类 Unix 操作系统中,-print 选项是默认的,可以省略。以下命令从根 ('/') 目录开始搜索文件 'grub.conf'。
$ find / -name grub.conf /etc/grub.conf
如果您不是计算机的管理员,您将收到对所有您无权读取的目录的错误消息。在这种情况下,对于 bash shell,请执行以下操作
$ find / -name grub.conf 2>/dev/null /etc/grub.conf
或者对于 csh/tcsh,请执行以下操作
$ find / -name grub.conf >& /dev/null /etc/grub.conf
如果您想忽略字符的大小写,可以使用 -iname。以下将找到扩展名为 txt、TXT、Txt 等等的文件
$ find / -iname '*.txt' /home/rtm/hacking.txt /home/bok/Documents/MyLetter.TXT /home/bok/tmp/found.tXt
以下命令将搜索所有名为 'local' 的目录。
$ find / -name local -type d /usr/X11R6/lib/X11/fonts/local /usr/local /var/cache/man/local /var/local
上面的示例结合了两个测试 - 文件名 (-name) 和文件类型 (-type) - 并返回满足这两个测试的文件(逻辑与)。
还可以指定两个或多个测试,并使用 -o(逻辑或)指令返回满足其中任何一个测试的文件。要进行 OR 操作的测试必须在 (...) 之间分组(必须用 \ 转义,因为括号对 shell 有特殊含义)。以下返回扩展名为 txt 或 doc 的文件,以及大小超过 5MB(兆字节)的任何文件。
$ find / \( -name '*.txt' -o -name '*.doc' -o -size +5M \) /home/rtm/hacking.txt /home/bok/report.doc /home/bok/backup/may.tar.bz2 /home/koppe/BiggerThan5Megs.doc
最后一个文件满足了两个测试。
注意:每个指令必须完整,测试不能省略。例如,-name '*.txt' -o '*.doc'(省略第二个 -name)是无效的。
提示: 使用 'exec' 选项对 find 找到的每个文件执行某些命令
$ find . -name '*bak' -exec rm -i {} \; rm: remove regular empty file `./file1.bak'? y rm: remove regular empty file `./file2.bak'? y rm: remove regular empty file `./file3.bak'? y
使用 'ok' 的效果相同,但它会提示每个文件
$ find . -name '*~' -ok rm {} \; < rm ... ./RMAIL~ > ? y
警告: 当使用 "-exec" 或 "-ok" 时,必须使用分号来指示参数的结束(在示例中为 "rm")。因为分号对 shell 有特殊含义,所以必须将其引用。上面的示例用反斜杠引用分号。
链接
在正常的可执行文件和手册页位置搜索指定的文件。似乎没有被 POSIX 涵盖。
示例
$ whereis ls ls: /bin/ls /usr/bin/ls /usr/man/man1/ls.1.gz /usr/share/man/man1/ls.1.gz
链接
- whereis 手册页, man7.org
- whereis 手册页, freebsd.org
在您的 PATH 变量中的位置搜索指定的文件。如果您知道程序在您的路径中(即您可以运行它),这比 whereis 速度更快。
$ which pine /usr/bin/pine
链接
- GNU which 项目, savannah.gnu.org
- which 手册页, freebsd.org
查找与指定查询匹配的所有文件名。在传统 UNIX 中不存在,是 GNU 软件,并随 Linux 标准提供。
示例
$ locate make.conf /etc/make.conf /etc/make.conf.orig /etc/make.conf.example /usr/qt/3/mkspecs/linux-g++/qmake.conf /usr/share/man/man5/make.conf.5.gz
请注意,locate 使用的是已收集的文件名数据库,该数据库通常每天更新一次。因此,使用 locate 不会正确显示新创建或删除的文件/目录。
链接
- 8.2 调用 locate 在 GNU Findutils 手册中,gnu.org
- locate 手册页, freebsd.org
将输入流中的项目转换为另一个命令的参数以调用。一个常见的用法是与 find 结合使用。
示例
- echo a b c | xargs -n1 echo
- 输出 a、b 和 c,每个都单独一行;-n1 指定最多将 1 个输入项目传递给命令一次。
- echo a,b,c | xargs -d, -n1 echo
- 在某些版本的 GNU xargs 中,输出 a、b 和 c,每个都单独一行。-d 指定项目分隔符。
链接
- xargs, opengroup.org
- xargs, freebsd.org
- 8.4 调用 xargs 在 GNU Findutils 手册中,gnu.org
- xargs 源代码, git.savannah.gnu.org
- W:xargs