linux - find命令如何搜索文件

标签 linux shell find

从另一个线程中挖掘 Move file that has aged x minutes ,出现了这个问题:

Linux 中常见的 find 命令如何搜索当前目录中的文件?

考虑一个包含相当大量文件的目录,那么:

首先 find MY_FILE.txt 立即返回,其次 find 。 -name MY_FILE.txt 需要更长的时间。

我使用 strace -c 来查看两者发生的情况,我了解到第二个命令调用目录扫描,这解释了为什么它速度较慢。

因此,必须优化第一个命令。有人能给我指出适当的资源或提供快速解释如何实现吗?

最佳答案

查找的语法是 find <paths> <expression> ,其中paths是从中开始搜索的文件和目录的列表。 find 从这些位置开始,然后递归(如果它们是目录)。

当你写find . -name MY_FILE.txt时它在 ./ 下执行递归搜索目录。但如果你写find MY_FILE.txt然后你告诉它从 ./MY_FILE.txt 开始搜索,所以确实如此:

$ strace -e file find MY_FILE.txt
...
newfstatat(AT_FDCWD, "MY_FILE.txt", 0x556688ecdc68, AT_SYMLINK_NOFOLLOW) = -1 ENOENT (No such file or directory)
...
(No such file or directory)
: No such file or directory
+++ exited with 1 +++

由于该路径不存在,因此只需一次系统调用即可确定不存在该文件。它调用newfstat() ,得到 No such file or directory错误,就是这样。

换句话说,find MY_FILE.txt不等于 find . -name MY_FILE.txt 。哎呀,我什至不会说它有用,因为你没有要求它进行搜索。你只是要求它告诉你是否 MY_FILE.txt当前目录是否存在。但您只需调用 ls MY_FILE.txt 即可找到答案。 .

区别如下:

[~]$ cd /usr
[/usr]$ find . -name sha384sum
./bin/sha384sum
[/usr]$ find sha384sum
find: ‘sha384sum’: No such file or directory

第一个执行递归搜索并找到 /usr/bin/sha384sum 。第二个不会递归并立即失败,因为 /usr/sha384sum不存在。看起来并没有更深。它在一纳秒内完成。

关于linux - find命令如何搜索文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58833367/

相关文章:

c++ - Linux 中的内存

ruby - 在 Ruby 中形成卫生 shell 命令或系统调用

java - 无法找到或加载主类、环境变量

Delphi:查找对话框和字符串网格

java - opencv Java中的findContours

linux - Emacs 不会退出

linux - 为什么 Cloudera Manager 报告磁盘已满?

linux - 如何在紧急模式下编辑 fstab?

linux - 使用 awk 使用通过函数传递的参数删除多行

macos - zsh - 使用默认值读取用户输入 - 空输入不为空?