如何在HDFS中仅列出文件名

37

我想知道是否有任何命令/表达式可以在Hadoop中仅获取文件名。当我执行hadoop fs -ls时,我只需要获取文件的名称,而它会打印整个路径。

我尝试过以下方法,但是想知道是否有更好的方法。

hadoop fs -ls <HDFS_DIR>|cut -d ' ' -f17 
7个回答

47
以下命令将仅返回文件名:

以下命令将仅返回文件名:

hdfs dfs -stat "%n" my/path/*

:添加于2021年2月4日

实际上,在过去的几年中,我使用了以下两个命令:

hdfs dfs -ls -d my/path/* | awk '{print $8}'

hdfs dfs -ls my/path | grep -e "^-" | awk '{print $8}'


1
"hadoop fs"已被弃用,请改用"hdfs dfs"。 - jirislav
1
只返回文件名(* 似乎不起作用)。 - samthebest
1
非常好的答案,我不确定为什么需要使用awk和sed技巧,因为已经有这个可用。 - anirudh.vyas
它只能像运行单个命令一样工作。如果我在for循环中运行它,它不会给出预期的结果。它是根据空格分离文件名的。 - user9518134
有什么理由需要在%n周围加引号?这似乎完全可以工作:hdfs dfs -stat %n my/path/* - user2739472
显示剩余2条评论

42

看起来 hadoop ls 不支持只输出文件名甚至仅最后一列的任何选项

如果你想可靠地获取最后一列,你应该先将空格转换为单个空格,这样就可以访问到最后一列:

hadoop fs -ls | sed '1d;s/  */ /g' | cut -d\  -f8

这将仅获取最后一列,但包含整个路径的文件。如果您只想要文件名,您可以使用basename,正如@rojomoke所建议的那样:

hadoop fs -ls | sed '1d;s/  */ /g' | cut -d\  -f8 | xargs -n 1 basename

我还过滤掉了第一行,该行内容为Found ?x items

注意:请注意,正如@felix-frank在评论中指出的那样,上述命令将无法正确保留包含多个连续空格的文件名。因此,Felix提出了更正确的解决方案:

hadoop fs -ls /tmp | sed 1d | perl -wlne'print +(split " ",$_,8)[7]'


1
非常感谢!!它起作用了!!我的需求是完整路径,所以感谢@rojomoke也回答了。 - Navneet Kumar
请使用以下代码:hdfs dfs -ls /data/.txt | rev | cut -d\ -f1 | rev。上述代码不支持所有文件名... - sri hari kali charan Tummala
还要注意的是,当使用glob模式(例如/path/to/*.log)列出文件时,第一行“Found ?X items”不会显示。更好、更精确的替换方式是:hdfs dfs -ls /path/*.log | sed 's/ */ /g;/Found [0-9]* items/d' | cut -d\ -f8 - ttimasdf

29

我希望这能对某些人有所帮助 - 版本在2.8.x+(也适用于3)中可用 -

hadoop fs -ls  -C  /paths/

完美,正是我所需要的,谢谢! - tricky
但如果目录中有多个文件,则此命令将所有文件路径作为单个字符串给出。请建议如何在新行中获取所有文件路径。 - user9518134

2
我经常使用另一种解决方案。以下是几个相关的事项:
  • 只列出文件和目录,不带“Found x items”:

hdfs dfs -ls -d mypath/*

  • 仅保留完整路径:

hdfs dfs -ls -d mypath/* | awk '{print $8}'

  • 仅文件名:

hdfs dfs -ls -d mypath/* | awk '{print $8}'| while read fn; do basename $fn; done

  • 如有需要,还可以使用路径模板:

hdfs dfs -ls -d {my,his}path/*.{txt,doc}

"Original Answer" 翻译成 "最初的回答"

1
 hadoop fs -ls  -C  /path/* | xargs -n 1 basename

0
使用basename命令,该命令从字符串中删除以'/'结尾的任何前缀。
basename $(hadoop fs -ls)

0
以下命令仅返回目录中的文件名。 Awk通过'/'分割列表并打印最后一个字段,即文件名。 hdfs dfs -ls /<folder> | awk -F'/' '{print $NF}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接