如何保护 Files.walk 免受符号链接递归的影响?使用 Java 或 shell。
好的,所以按照链接。
Stream<Path> stream = walk(startPath, maxDepth, FileVisitOption.FOLLOW_LINKS);
但是检查每个目录是否是符号链接:
Files.isSymbolicLink(path) && Fles.isDirectory(path)
用
Path realPath = path.toRealPath();
然后保持一个目录列表在,祖先,一个可以防止递归。当符号链接位于列表/当前路径中的某个位置时,通过为每个目录检查祖先。
a > b > START:c > d > e > SYMBOLIC:f=a > b > c
(这仍然不能阻止访问一个目录两次,因为可以在不递归的情况下链接同一个目录或子目录。)
1
在Files.walk
不出现是受保护的符号链接递归。您可以通过设置maxDepth
为合理的值来限制搜索深度,例如 idk 200 ish?
如果您需要一个比任意限制深度更健壮的方法,您可以实现一个方法FileVisitor
,当它遇到符号链接时会进行一些检查以查看它是否是递归的,然后决定是否要遵循它。然后将访问者与Files.walkFileTree
. 但是,这不会为您提供良好的路径流,因此您可能需要对代码进行一些调整。
至于检测递归的符号链接,我认为您可以使用一些魔法File.getCanonicalPath
和访问规范路径的哈希图。我手头没有 linux 机器,所以我还没有测试过,YMMV。
无论您做什么,都不要List
像其他答案所建议的那样使用访问过的路径,因为这会给您 O(n²) 时间来遍历文件系统。