You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Shell脚本递归对比HDFS两文件夹并同步缺失文件至folder-2?

解决方案:用Shell脚本同步HDFS目录差异

当然可以实现!下面我会给你一个实用的Shell脚本,帮你把folder-1中folder-2缺失的文件和子文件夹同步过去。

脚本核心思路

  1. 递归列出两个HDFS目录下的所有文件和子目录,同时标记条目类型(文件/目录)
  2. 对比两个目录的条目列表,筛选出folder-1独有的内容
  3. 针对这些独有内容,先创建对应的目录(如果是目录类型),再复制文件到目标目录

完整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 "同步操作完成!"

使用步骤

  1. 将脚本中的SOURCE_HDFS_DIR和TARGET_HDFS_DIR替换为你实际的HDFS路径
  2. 给脚本添加执行权限:chmod +x sync_hdfs_diff.sh
  3. 运行脚本:./sync_hdfs_diff.sh

注意事项

  • 确保你拥有HDFS源目录的读取权限和目标目录的写入权限
  • 如果目录内容较多,递归列目录的过程可能需要一些时间,请耐心等待
  • 若想先验证差异,可暂时注释掉hdfs dfs -mkdir和hdfs dfs -cp命令,只打印待处理的条目,确认无误后再执行实际同步

内容的提问来源于stack exchange,提问作者Kiran Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:16:09