首页 > 解决方案 > 如何使用 bash 在 HDFS 中的一行上列出带有元数据的文件?

问题描述

我正在编写一个 bash 脚本来扫描 HDFS 并对输出进行处理。

通过以下方式获取文件名很容易:

    for line in $(hdfs dfs -ls -t -r -C -R $HDFS_CLEANING_STG); do
        echo $line
    done

输出:

/dir
/dir/file1
/dir/file2

但是,它会删除文件大小、日期、权限等。

使用相同的方法但没有-C标志,它提供元数据,但不是仅在一行上:

输出示例:

-rw-rw-r--+
3
hdfs
hdfs
34448169
2020-05-04
11:36
/dir/file

我想获取这些信息,但使用此输出(如“正常” ls):

-rw-rw-r--+ 3 hdfs hdfs 34448169 2020-05-04 11:36 /dir/file

我怎样才能做到这一点?

标签: bashhadoophdfs

解决方案


问题出在 for 循环中。当你这样做时for line in $(hdfs dfs -ls -t -r -C -R $HDFS_CLEANING_STG);,它会遍历每个单词,而不是每一行。所以,每次它面对一个空白时,它的值都会line随着你刚刚读到的单词而变化。

修复它的一个简单方法是这样做:

for line in "$(hdfs dfs -ls -t -r -C -R $HDFS_CLEANING_STG)"; do
    echo "$line"
done

或者像这样:

hdfs dfs -ls -t -r -C -R $HDFS_CLEANING_STG | while read line; do
    echo "$line"
done

推荐阅读