跳过符号链接,同时使用hadoop的文件系统递归地列出文件

w8biq8rn  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(717)

我在用hadoop的 FileSystem ( org.apache.hadoop.fs.FileSystem )要递归列出目录下的所有文件,请执行以下操作:

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

但是,我有一个递归符号链接 /my/path/symlink -> /my/path ,和 listFiles 返回一个巨大的路径列表,如

/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:/ 路径。

rggaifut

rggaifut1#

有一次,我需要在一个路径下递归地列出目录,我根据filesystem.java中listfiles的代码编写了自己的listdirectories函数。
如果你看代码,它是非常简单的,只是你应该避免重复出现在一个filestatus如果它是一个符号链接。但是需要注意的是,您不会得到包含父符号链接的路径。
您应该更改此函数:

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());
    }
  }

相关问题