在 Linux 中查找文件和文件夹
当你在 Bash 命令行上并且需要在指定位置查找特定类型的文件或以某个名称开头的文件夹时,你会怎么做?find
命令可以帮助你找到可能符合广泛标准的文件和文件夹,因此,它是 Linux 中功能强大的命令行实用程序。
本教程将解释在 Bash shell 上下文中使用 find
命令,介绍基本用法、高级用例以及与其他 Bash shell 功能相结合的用法。
Bash 中 find
命令的基本用法
find
命令是一种通用工具,用于查找从普通文件到满足 REGular EXpressions 的多个文件和文件夹的任何内容。最简单的用例,仅在当前目录中查找特定文件或文件夹,可以实现如下。
find filename.ext
find foldername
执行相应命令后,如果文件或文件夹存在,则会打印出它们的名称。
find
命令还可以搜索目录,进入子目录查找指定的文件或文件夹。假设我们有许多名为 test
的文件分散在当前目录的文件夹中。
要查看它们的位置,我们可以键入以下内容。
find . -name test -type f
该代码应返回当前目录和子目录中所有名为 test
的文件的路径。使用参数 -type f
确保我们不会捕获也命名为 test
的目录 - 如果你是程序员,你一定会拥有许多这样的目录。
-name
参数是不言自明的,但如果你希望在搜索指定名称时不区分大小写以捕获诸如 tEST、Test 或 TeST 之类的名称,我们可以使用 -iname
参数代替,其中 i
代表不敏感。
Bash glob 与 find
命令的使用没有严格的关系。如果你可能不知道模式中存在哪些字符或其中有多少个字符,则可以使用位于模式中的星号。
例如,如果你想捕获以下文件:test、test2、test_3、testt1,你可以使用 glob 来捕获这些短语,因为它们都以单词 test 开头。
以下命令执行此操作。
find . -name test*
代码应返回以单词 test 开头的任何文件或目录(注意删除了 -type f
参数)。
Bash 中 find
命令的高级用法
find
命令可以扩展以匹配各种标准。如果你想基于多个 glob 或名称捕获文件,你可能需要考虑使用 -o
或 OR 函数。
例如,如果你想在一个目录中同时查找 PDF 和 Word DOC/DOCX 文件,你可以通过以下方式进行。
find -iname '*.pdf' -o -iname '*.doc' -o -iname '*.docx'
捕获扩展名已设置为大写的文件的不敏感名称参数可能是某些程序的情况。
如果你更熟悉 RegEx,你也可以使用模式来指定多个条件,使用 -regex
或 -iregex
参数。
要捕获与上述相同的扩展名,并另外查找以 test 开头的文件,我们可以使用以下模式:
find -regex '.*/test*.\(pdf\|doc\|docx\)' -type f
对特殊的正则表达式字符(如括号和管道符号)使用反斜杠会阻止 Bash 处理它们并将整个字符串直接传递给 find
命令以防止我们的正则表达式失败。
最后,一些关于如何使用 find
命令输出的讨论 - 你可以通过管道输入 wc
来计算匹配文件和文件夹的出现次数,这是一个字符/单词/行计数实用程序。
find -regex '.*/test*.\(pdf\|doc\|docx\)' -type f | wc -l
你可以将数据保存到一个变量中,以便稍后在脚本中由命令解析。
DOCS=$(find -regex '.*/test*.\(pdf\|doc\|docx\)' -type f)
请记住,文件路径中可能存在特殊字符,包括空格、换行符和括号,从而在将此类变量传递给命令时导致奇怪的行为。确保在处理此类数据时相应地设置 IFS 分隔符。
find
命令还提供类似于 xargs
操作的逐项命令执行。你可以使用 -exec
参数来实现此目的。
例如,如果你想获得匹配的所有文件和文件夹的权限,可以执行以下操作:
find -regex '.*/test*.\(pdf\|doc\|docx\)' -type f -exec ls -l {} \;