java - 使用 Hadoop 的文件系统递归列出文件时跳过符号链接(symbolic link)

标签 java hadoop symlink

我正在使用 Hadoop 的 FileSystem (org.apache.hadoop.fs.FileSystem) 递归列出目录下的所有文件:

FileSystem.listFiles(new Path("file:/my/path"), true)

但是,我有一个递归符号链接(symbolic link) /my/path/symlink ->/my/pathlistFiles 返回一个巨大的路径列表,例如

/my/path/symlink
/my/path/symlink/symlink
/my/path/symlink/symlink/symlink
/my/path/symlink/symlink/symlink/symlink
/my/path/symlink/symlink/symlink/symlink/symlink
...

是否有标志或配置参数来防止这种情况发生?

我需要使用 FileSystem,因为我同时使用了 hdfs:/file:/ 路径。

最佳答案

一旦我需要递归地列出路径下的目录,我就根据 FileSystem.java 中 listFiles 的代码编写了自己的 listDirectories 函数。

如果你看一下代码,它非常简单,只是你应该避免在 FileStatus 上重复出现,如果它是一个符号链接(symbolic link)。但需要注意的是,您不会获得包含父符号链接(symbolic link)的路径。

你应该改变这个功能:

private void handleFileStat(LocatedFileStatus stat) throws IOException {
    if (stat.isFile()) { // file
      curFile = stat;
    } else if (recursive) { // directory
      itors.push(curItor);
      curItor = listLocatedStatus(stat.getPath());
    }
  }

类似于:

private void handleFileStat(LocatedFileStatus stat) throws IOException {
    if (stat.isFile()) { // file
      curFile = stat;
    } else if (recursive && !stat.isSymlink()) { // directory and not symlink
      itors.push(curItor);
      curItor = listLocatedStatus(stat.getPath());
    }
  }

关于java - 使用 Hadoop 的文件系统递归列出文件时跳过符号链接(symbolic link),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45346225/

相关文章:

java - 是 6.1 java.lang.VerifyError : class loading constraint violated

hadoop - HBase-0.98.8-hadoop2 中的 Hive-0.14.0 集成问题

unix - 将同一配置单元 session 中的多个查询输出导出到 shell 脚本?

hadoop - 通过Web界面运行Hadoop作业

使用ansible将符号链接(symbolic link)复制到另一个位置?

java - 驱动程序.java :55: error: 'else' without 'if'

java - 如何在 android 中从 Arraylist 日期按降序对日期进行排序?

ruby - 使用 'require' 和符号链接(symbolic link)时的路径问题

java - 带有单个字母的正则表达式无法识别

powershell - 如何在powershell中遵循快捷方式