我想知道是否有任何命令/表达式可以在Hadoop中仅获取文件名。当我执行hadoop fs -ls
时,我只需要获取文件的名称,而它会打印整个路径。
我尝试过以下方法,但是想知道是否有更好的方法。
hadoop fs -ls <HDFS_DIR>|cut -d ' ' -f17
以下命令将仅返回文件名:
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}'
看起来 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]'
/path/to/*.log
)列出文件时,第一行“Found ?X items”不会显示。更好、更精确的替换方式是:hdfs dfs -ls /path/*.log | sed 's/ */ /g;/Found [0-9]* items/d' | cut -d\ -f8
。 - ttimasdf我希望这能对某些人有所帮助 - 版本在2.8.x+(也适用于3)中可用 -
hadoop fs -ls -C /paths/
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}
hadoop fs -ls -C /path/* | xargs -n 1 basename
basename $(hadoop fs -ls)
hdfs dfs -ls /<folder> | awk -F'/' '{print $NF}'
hdfs dfs -stat %n my/path/*
- user2739472