跳至内容

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。以下将找到扩展名为 txtTXTTxt 等等的文件

$ 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 有特殊含义)。以下返回扩展名为 txtdoc 的文件,以及大小超过 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

链接

在您的 PATH 变量中的位置搜索指定的文件。如果您知道程序在您的路径中(即您可以运行它),这比 whereis 速度更快。

$ which pine
/usr/bin/pine

链接

查找与指定查询匹配的所有文件名。在传统 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 不会正确显示新创建或删除的文件/目录。

链接

将输入流中的项目转换为另一个命令的参数以调用。一个常见的用法是与 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 指定项目分隔符。

链接

华夏公益教科书