如何从命令行查找文件系统中的文件?

如何从命令行查找文件系统中的文件?

我想找到文件(文件名部分已知)在文件系统中的位置。我想知道如何从命令行执行此操作,而不是使用 GUI 实用程序。

在 Windows 中,我将运行以下命令:

cd /d C:\
dir *filename* /s

Linux 的等价物是什么?

答案1

locate filename
find -name '*filename*'
echo **/*filename*
ls -ld **/*filename*

(请继续阅读主要条款和条件。请阅读手册中的细则。)

列出目录的内容是ls.的主要工作ls(占据其大部分复杂性的工作)是微调其显示。 (查看手册并比较与选择要显示的文件相关的选项数量与控制要显示每个文件的信息以及显示格式的选项数量。这两者都是正确的GNU 语言你会在 Linux 上找到它,并且其他系统选项较少,因为早期的天。)

默认模式ls是当你传递一个目录时,它会列出该目录中的文件。如果您向它传递任何其他类型的文件(常规文件、符号链接等),它只会列出该文件。 (这分别适用于每个参数。)该选项-d告诉ls您永远不要进入目录。

ls确实有一个选项-R告诉它递归地列出目录。但它的适用性有限,并且不允许对输出进行太多过滤。

第一个执行模式匹配的工具是 shell 本身。您不需要任何其他命令:只需键入通配符即可完成设置。这被称为通配

echo *filename*

传统上,通配符仅限于当前目录(或指示的目录:)echo /some/where/*filename*。 A*匹配任何文件名或文件名的任何部分,但*.txt不匹配foo/bar.txt.现代 shell 添加了模式**/,意思是“在此目录中,或其下面的任何目录中(递归地)”。对于 bash,出于历史兼容性原因,需要显式启用此功能shopt -s globstar(您可以将此行放在您的 中~/.bashrc)。

echo **/*filename*

echo命令只是将 shell 生成的文件名列表回显给您。作为例外,如果根本没有匹配的文件名,则 bash 中的通配符模式将保持不变(除非您设置shopt -s nullglob,在这种情况下模式将扩展为空列表),并且 zsh 会发出错误信号(除非您设置setopt nullglob,或setopt no_no_match这会导致模式保持不变)。

您可能仍然想使用ls它的选项。例如,ls可以通过颜色指示文件(目录、可执行文件等)的性质或权限。您可能希望使用 .txt 显示文件的日期、大小和所有权ls -l。请参阅手册了解更多选项。

在目录树中查找文件的传统命令是find。它提供了许多选项来控制要显示的文件以及如何处理它们。例如,要*filename*在当前目录及其子目录中查找名称与模式匹配的文件并打印它们的名称:

find /some/dir -name '*filename*' -print

-print是一个操作(大多数其他操作包括在文件上执行命令);如果您不采取行动,-print则暗示。另外,如果您没有指定要遍历的任何目录(/some/dir上面),则隐含当前目录。该条件-name '*filename'表示仅列出(或操作)名称与该模式匹配的文件;还有许多其他过滤器,例如-mtime -1匹配过去 24 小时内修改的文件。有时您可以省略 上的引号-name '*filename*',但前提是通配符不匹配当前目录中的任何文件(见上文)。总而言之,缩写形式是

find -name '*filename*'

当您知道(部分)文件名时,另一个有用的工具是locate.该工具查询文件名数据库。在典型的系统上,它每晚都会刷新。locateover的优点find /是速度快很多。缺点是它的信息可能是陈旧的。有几种实现,locate它们在多用户系统上的行为有所不同:基本locate程序仅索引公开可读的文件(您可能需要运行配套程序updatedb来创建第二个数据库来索引您帐户中的所有文件);还有其他版本(mlocate、slocate)可以索引所有文件并让程序locate过滤数据库以仅返回您可以看到的文件。

locate filename

有时您认为某个文件是由您的发行版中的软件包提供的,您知道(部分)该文件的名称,但不知道软件包的名称,并且您想要安装该软件包。许多发行版为此提供了工具。在 Ubuntu 上,它是apt-file search filename.对于其他系统上的等效命令,请检查吃豆人罗塞塔

答案2

与您的 DOS 示例等效的是:

cd /
find . -name \*filename\* -print

不过,在 Linux 上,您通常不再需要该-print参数。如果您发现自己在其他操作系统上工作,了解一下会很方便。

答案3

如果你想要什么“快速地”,但不是在关键任务情况下,您只想知道它是否存在以及它在哪里,您可以使用locate.它保留了您告诉它收集信息的目录中所有文件的数据库。

在默认安装(在 Ubuntu 上)中,locate设置cron扫描文件系统并更新数据库的日常作业...

如果您觉得需要在下一次 cron 更新之前更新数据库,它通常比直接运行find或更快。如果您需要进行更多搜索,它肯定会更快...顾名思义,更新使用的数据库...lssudo updatedblocateupdatedblocate

locate有内置的正则表达式,这使得它非常方便......我将find在脚本中使用,但我很少find在命令行中使用。我什至locate在(个人)脚本中使用......例如。locate -bir "oo.*datt.*mp4$"

locate返回匹配文件的完全限定路径。

答案4

find [path] -name [filename]

例如,如果我想在 /home 目录中搜索包含 foo 的文件名,我将使用以下命令:

find /home -name *foo*

使用该命令man find获取有关 find 命令和参数的更多信息,

相关内容