关于HDFS路径文件夹名称的问题

问题发现

​ 最开始的需求:修改/origin_data/gmall/db目录下所有以inc结尾的文件夹里的文件夹(名称为2024-11-15)修改为2020-6-14

问gpt写了个脚本:

#!/bin/bash

# 遍历 /origin_data/gmall/db 下所有以 "inc" 结尾的文件夹
for dir in $(hdfs dfs -ls /origin_data/gmall/db | grep '/inc$' | awk '{print $8}'); do
    # 检查目录下是否存在名为 "2024-11-15" 的子文件夹
    if hdfs dfs -test -d "$dir/2024-11-15"; then
        # 将 "2024-11-15" 重命名为 "2020-6-14"
        hdfs dfs -mv "$dir/2024-11-15" "$dir/2020-6-14"
        echo "Renamed $dir/2024-11-15 to $dir/2020-6-14"
    fi
done
  • 运行后发现目标文件夹名称没有改变
  • 单独运行hdfs dfs -ls /origin_data/gmall/db可以有返回值

将脚本修改一下:

#!/bin/bash

# 遍历 /origin_data/gmall/db 下所有以 "inc" 结尾的文件夹
for dir in $(hdfs dfs -ls /origin_data/gmall/db | grep 'inc' | awk '{print $NF}'); do
    # 检查目录下是否存在名为 "2024-11-15" 的子文件夹
    if hdfs dfs -test -d "$dir/2024-11-15"; then
        # 将 "2024-11-15" 重命名为 "2020-6-14"
        hdfs dfs -mv "$dir/2024-11-15" "$dir/2020-6-14"
        echo "Renamed $dir/2024-11-15 to $dir/2020-6-14"
    else
        echo "No 2024-11-15 directory found in $dir"
    fi
done
  • 目标文件夹成功修改,但是会将不是以inc结尾,但具有inc字串的文件夹误修改

  • 例如存在错误返回值:No 2024-11-15 directory found in /origin_data/gmall/db/base_province_full

为了实现准确的需求询问gpt排查问题:得知可以使用使用 cat -A 来显示不可见字符

hdfs dfs -ls /origin_data/gmall/db | cat -A

结果:

得知每个路径的末尾有 $ 符号,表示行末,可以使用inc$代表以inc结尾,故hdfs dfs -ls /origin_data/gmall/db | grep -E 'inc$'可以正确返回而hdfs dfs -ls /origin_data/gmall/db | grep -E '/inc$'是错误的,明显gpt把转义符\当成了/,/会被系统识别为路径的分隔符

posted @ 2024-11-16 20:46  想吃烧饼  阅读(72)  评论(0)    收藏  举报