locate txt 与locate *.txt 有什么区别?

Ran*_*son 11 shell filenames locate

输出locate txt | head

/etc/brltty/brl-ba-all.txt
/etc/brltty/brl-bd-all.txt
/etc/brltty/brl-bl-18.txt
/etc/brltty/brl-bl-40_m20_m40.txt
/etc/brltty/brl-ec-all.txt
/etc/brltty/brl-ec-spanish.txt
/etc/brltty/brl-eu-all.txt
/etc/brltty/brl-lb-all.txt
/etc/brltty/brl-lt-all.txt
/etc/brltty/brl-mb-all.txt
Run Code Online (Sandbox Code Playgroud)

输出locate *.txt | head

/home/abc/capital.txt
/home/abc/state.txt
Run Code Online (Sandbox Code Playgroud)

为什么输出结果会有如此巨大的差异?第二个命令似乎只检查我的主文件夹,但第一个命令似乎检查许多目录。为什么会这样?

Sté*_*las 23

locate txt查找路径包含txt\xc2\xb9 的所有文件(任何类型,包括常规、符号链接、目录、套接字...),因此包括/foo/xtxty/bar/foo/bar.txt/foo/txt.bar等。

\n

locate *.txt是错误的,因为它*没有被引用,所以*.txtshell 会首先将其扩展为当前目录中与该模式匹配的所有文件名,并将结果传递给locate,因此,例如,如果当前目录包含a.txtb.txt,那么最终将运行它根据实现来定位locate a.txt b.txt包含和 a.txt或的路径,它们都例如(您的看起来像是第一类中的一个,并且您可能从内部运行命令b.txtlocate/foo/da.txtob.txt/home/abc)。

\n

如果当前目录中没有.txt文件,根据 shell,您会收到错误或locate以字面意思作为参数进行调用*.txt

\n

要始终locate使用您想要的文字进行调用*.txt,您需要确保*为 shell 引用该文字,如果在类似 Bourne 的 shell 中,则使用"..."'...'反斜杠,单引号是最好的,因为它们引用 Bourne 中的每个字符类似 shell,是 shell 中最便携的:

\n
locate '*.txt'\n
Run Code Online (Sandbox Code Playgroud)\n

然后,由于该参数包含通配符 ( *),locate因此从子字符串搜索切换到模式匹配搜索(与 shell 或其他识别的搜索相同find -name)并返回与该模式匹配的所有文件路径,即所有.txt/foo/.txt、 或结尾的文件路径/foo/bar.txt

\n

locate不是标准命令,并且有许多不兼容的实现,但上面的这些简单行为对于大多数(如果不是全部)来说是常见的。大多数实现支持各种选项来进行不同的匹配。检查您自己的locate文档man locate,而不是互联网上的一些随机页面,因为它们可能很好地记录了不同的实现和/或版本。

\n
\n

\xc2\xb9 并且在定位数据库上次更新时确实存在

\n


pol*_*mon 8

例如,当您使用像 ( <command> *.txt) 这样的通配符时,扩展是由您的 shell 完成的,而不是您正在运行的命令,或者在本例中是locate

如果您想确保通配字符传递给您正在运行的命令,请将其放在引号中:

locate "*.txt"
Run Code Online (Sandbox Code Playgroud)

或使用以下命令逃避它\

locate \*.txt
Run Code Online (Sandbox Code Playgroud)

此外,locate有一个或多或少基于正则表达式的匹配算法,但不完全是。如果搜索txt,它会假设您希望txt成为文件名的一部分,而不一定是在末尾。

不过,您可以强制进行正则表达式处理:

locate -r "txt$"
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅locate手册页


che*_*ner 5

locate模式作为参数。由于*.txt没有被引用,shell 会尝试首先扩展它而不是逐字传递它。

另外,请注意:

作为一种特殊情况,不包含通配字符(“foo”)的模式会像“*foo*”一样进行匹配。

所以locate txt相当于locate '*txt*'. 假设当前目录只包含a.txtand b.txt,则locate *.txt扩展为locate a.txt b.txt, and so 相当于locate '*a.txt*' '*b.txt*'