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

如何使用bash在HDFS中一行列出包含元数据的文件?,bash,hadoop,hdfs,Bash,Hadoop,Hdfs,我正在编写一个bash脚本,它扫描hdf并处理输出 通过以下操作可以轻松获取文件名: 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

我正在编写一个bash脚本,它扫描hdf并处理输出

通过以下操作可以轻松获取文件名:

    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
):


如何实现这一点?

问题在for循环中。当您对$中的行执行
时(hdfs dfs-ls-t-r-C-r$hdfs\u CLEANING\u 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
或者像这样:

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

问题在for循环中。当您对$中的行执行
时(hdfs dfs-ls-t-r-C-r$hdfs\u CLEANING\u 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
或者像这样:

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

你在for循环中做什么?如何打印?@FrancescoLucianò我只是“呼应”了$line变量。问题更新。在for循环中你做什么?如何打印?@FrancescoLucianò我只是“呼应”了$line变量。问题更新了,就这样!但是没有-C标志。@Francesco Lucianò,+1,因为好的接球。就这样!但是没有-C标志。@Francesco Lucianò,+1,因为有好的接球机会。