从另一个线程Move file that has aged x minutes挖掘出这个问题:
在Linux中通常找到的find
命令如何在当前目录中搜索文件?
考虑一个包含大量文件的目录,然后:
首先,find MY_FILE.txt
立即返回,其次,find . -name MY_FILE.txt
需要更长的时间。
我使用strace -c
来查看两者发生的情况,并了解到第二条命令调用了目录扫描,这解释了为什么它比较慢。
因此,必须优化第一个命令。谁能指出我合适的资源或快速解释如何实现?
最佳答案
find的语法为find <paths> <expression>
,其中path是从其开始搜索的文件和目录的列表。查找从这些位置开始,然后递归(如果它们是目录)。
编写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/