find命令如何搜索文件

时间:2019-11-13 08:53:33

标签: linux shell find

从另一个线程Move file that has aged x minutes进行查询,出现了这个问题:

通常在Linux中找到的find命令如何在当前目录中搜索文件?

请考虑一个包含大量文件的目录,然后:

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

我使用strace -c来了解两者的情况,并且我了解到第二个命令调用了目录扫描,这解释了为什么它比较慢。

因此,必须对第一个命令进行优化。谁能指出我合适的资源或快速解释如何实现?

1 个答案:

答案 0 :(得分:1)

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

编写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不存在而立即失败。它看起来没有更深。它在一纳秒内完成。