如何用Shell脚本递归对比HDFS两文件夹并同步缺失文件至folder-2?
解决方案:用Shell脚本同步HDFS目录差异
当然可以实现!下面我会给你一个实用的Shell脚本,帮你把folder-1中folder-2缺失的文件和子文件夹同步过去。
脚本核心思路
- 递归列出两个HDFS目录下的所有文件和子目录,同时标记条目类型(文件/目录)
- 对比两个目录的条目列表,筛选出folder-1独有的内容
- 针对这些独有内容,先创建对应的目录(如果是目录类型),再复制文件到目标目录
完整Shell脚本
#!/bin/bash # 替换为你的实际HDFS路径 SOURCE_HDFS_DIR="/your/hdfs/path/folder-1" TARGET_HDFS_DIR="/your/hdfs/path/folder-2" # 创建临时文件存储目录列表(避免占用内存) SOURCE_LIST=$(mktemp) TARGET_LIST=$(mktemp) # 递归列出源目录的所有条目,提取类型标识和完整路径 hdfs dfs -ls -R "$SOURCE_HDFS_DIR" | awk '{print $1, $NF}' > "$SOURCE_LIST" # 同样处理目标目录的条目 hdfs dfs -ls -R "$TARGET_HDFS_DIR" | awk '{print $1, $NF}' > "$TARGET_LIST" # 对比列表,找出源目录独有的条目并处理 comm -23 "$SOURCE_LIST" "$TARGET_LIST" | while read -r TYPE PATH; do # 将源路径转换为目标路径 TARGET_PATH="${PATH/$SOURCE_HDFS_DIR/$TARGET_HDFS_DIR}" if [[ "$TYPE" == d* ]]; then # 若为目录,先创建目标目录(-p确保父目录自动生成) hdfs dfs -mkdir -p "$TARGET_PATH" echo "已创建目录: $TARGET_PATH" else # 若为文件,执行复制操作 hdfs dfs -cp "$PATH" "$TARGET_PATH" echo "已复制文件: $PATH -> $TARGET_PATH" fi done # 清理临时文件 rm -f "$SOURCE_LIST" "$TARGET_LIST" echo "同步操作完成!"
使用步骤
- 将脚本中的
SOURCE_HDFS_DIR和TARGET_HDFS_DIR替换为你实际的HDFS路径 - 给脚本添加执行权限:
chmod +x sync_hdfs_diff.sh - 运行脚本:
./sync_hdfs_diff.sh
注意事项
- 确保你拥有HDFS源目录的读取权限和目标目录的写入权限
- 如果目录内容较多,递归列目录的过程可能需要一些时间,请耐心等待
- 若想先验证差异,可暂时注释掉
hdfs dfs -mkdir和hdfs dfs -cp命令,只打印待处理的条目,确认无误后再执行实际同步
内容的提问来源于stack exchange,提问作者Kiran Kumar
相关产品推荐
相关产品推荐

