如何使用 bash 脚本管理 hdfs 中的目录?

How to manage directories in hdfs with a bash script?

最近我试图写一个bash脚本来管理hdfs中的一些目录,以便与kafka一起工作。

假设在hdfs中我们有这样一个目录:

/tmp/my_dir/state=a

当我用 hdfs dfs -ls /tmp/my_dir/state=a 列出这个目录时,结果是:

part=2020-05-10
part=2020-05-11
.
.
.
part=2020-05-20

每个文件夹都包含一些文件,我想将这些文件夹按特定日期分成两个目录。

我的目标是创建两个目录,它们是 version=1version=2,我想根据特定日期将每个部分文件夹移动到这两个目录,所以所有部分文件夹都较小日期为

/tmp/my_dir/version=1/state=a

其他的去

/tmp/my_dir/version=2/state=a

我准备了这段代码,但它不能正常工作。 谁能帮我更正一下?

for fullname in `hdfs dfs -ls /tmp/my_dir/state=a | awk '{print $NF}' | grep part | tr '\n' ' '`; do

    name=$(basename $fullname)

    if [[ "${name#*=}" < "$selected_date" ]]; then

        hdfs dfs -mv $fullname /tmp/my_dir/version=1/state=a

    else
        hdfs dfs -mv $fullname /tmp/my_dir/version=2/state=a
    fi
done


我发现了我的问题!

只是因为我没有创建内部目录,我应该在循环指令之前使用这个命令:

hdfs dfs -mkdir /tmp/my_dir/version=1
hdfs dfs -mkdir /tmp/my_dir/version=2

hdfs dfs -mkdir /tmp/my_dir/version=1/state=a
hdfs dfs -mkdir /tmp/my_dir/version=2/state=a

您实际上可以通过为 mkdir 提供 -p 标志来使用单个命令实现此目的:

hdfs dfs -mkdir -p version=1/state=a version=2/state=a

作为一般建议,我建议使用更好的命名约定。在这种特殊情况下,v1/state_a/v2/state_a/ 是合适的(甚至 v1/state/a/)。