如何使用 bash 在 HDFS 的一行中列出带有元数据的文件?

How to list files with metadata on one line in HDFS with bash?

我正在编写一个 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

我想获取这些信息,但输出如下(如 "normal" ls):

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

我怎样才能做到这一点?

问题出在for循环中。当您执行 for line in $(hdfs dfs -ls -t -r -C -R $HDFS_CLEANING_STG); 时,它会遍历每个单词,而不是遍历每一行。所以,每次它面对一个白色的space,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