如何在使用`copyToLocal`时排除目录

时间:2017-04-13 04:39:56

标签: hdfs hadoop2

我想从HDFS复制文件。我希望在复制文件时排除文件夹。我尝试了hdfs dfs -copyToLocal,但它也在我测试时复制了目录。

是否有任何方法/命令来复制文件而不是目录?

2 个答案:

答案 0 :(得分:2)

据我所知,-copyToLocal没有直接标记只复制文件。但是您可以使用linux grep从正在复制的数据中排除目录。像这样:

hdfs dfs -ls <HDFS_DIR_PATH> | grep "^-" | awk 'BEGIN{FL=""} {FL=FL" "$8} END{system("hdfs dfs -copyToLocal "FL" .")}'

其中,

  • hdfs dfs -ls <HDFS_DIR_PATH>用于列出所有文件和目录

  • grep "^-"用于排除目录

  • awk 'BEGIN{FL=""} {FL=FL" "$8}用于创建仅包含文件路径的字符串

  • END{system("hdfs dfs -copyToLocal "FL" .")}'用于复制文件路径列表

请注意,在最后一个命令中,您可以使用任何本地文件系统路径而不是.

答案 1 :(得分:0)

@ daemon12答案的变体,可以实现相同的目的。

hadoop fs -ls <HDFS_DIR_PATH> | grep "^-" | \
awk '{print $8'} | hadoop fs -copyToLocal $(xargs) .
  • awk '{print $8'}用于从ls输出中获取实际路径列。
  • $(xargs)用于将路径的行连接到以空格分隔的字符串中。