问题发现
最开始的需求:修改/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"elseecho "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把转义符\
当成了/
,/
会被系统识别为路径的分隔符