我得到一个路径数组(从默认设置和用户设置组合),并且需要对某些数据文件执行递归搜索,这些数据文件可以隐藏在这些路径中的数万个文件之间。
我使用RecursiveDirectoryIterator
进行递归搜索,但速度非常慢,建议的替代exec("find")
is even slower。为了节省时间,I / O和处理能力,我希望事先做一些预处理,以避免多次搜索目录树并计算给定路径的最小公分母。我很感激有关如何做到这一点的任何建议。
问题在于,任何给定路径可能不仅是其他路径的祖先,或者只是彼此符号链接,而是可以作为实际路径或符号链路的路径给出。至少有一个人可能认为没有任何盘旋符号链接(虽然支票不会很糟糕)。
我需要在PHP中实现这一点,并且我勾勒出了以下代码,该代码还没有覆盖所有案例。
// make all given paths absolute and resolve symlinks
$search_paths = array_map( function($path) {
return realpath( $path ) ?: $path;
}, $search_paths );
// remove all double entries
$search_paths = array_unique( $search_paths );
// sort by length of path, shortest first
usort($search_paths, function($a, $b) {
return strlen($a) - strlen($b);
});
// iterate over all paths but the last
for ( $i = 0; $i < count( $search_paths ) - 1; $i++ ) {
// iterate over all paths following the current
for ( $j = $i; $j < count( $search_paths ); $j++ ) {
if ( strpos ( $search_paths[$j], $search_paths[$i] ) === 0 ) {
// longer path starts with shorter one, thus it's a child. Nuke it!
unset( $search_paths[$j] );
}
}
}
此代码不足的地方:
想象一下$search_paths
/e/f
/a/b/c/d
/e/f/g/d
/e/f/g/d
是/a/b/c/d
的符号链接。
上面的代码会留下这两个:
/e/f
/a/b/c/d
但搜索/e/f
实际上已足够,因为它通过符号链接/a/b/c/d
覆盖/e/f/g/d
。这可能听起来像一个边缘情况,但实际上很可能在我的情况下。
整蛊,嗯?
我很确定我不是唯一一个遇到此问题的人,但我无法使用谷歌找到解决方案。也许我只是没有对问题采取正确的措辞。
感谢您阅读此内容! :)