在Linux Bash中递归检查两个目录下的文件是否互存并输出存在状态的实现方法
在Linux Bash中递归检查两个目录下的文件是否互存并输出存在状态的实现方法
嘿,我明白你的需求了——你现在的脚本只能检查目录的当前层级,想要改成递归遍历两个目录,并且双向检查每个文件在对方目录的对应路径是否存在,最后输出清晰的状态报告对吧?
我给你整理了一个健壮的实现方案,不仅能递归处理所有层级,还能避免重复报告相同的文件路径,完全符合你给出的示例需求:
# 定义两个目标目录的路径 pth1="/mntA/newpics" pth2="/mntB/oldpics" # 初始化关联数组,用来记录已经处理过的文件相对路径,避免重复输出 declare -A processed_paths # 第一步:检查pth1中所有文件在pth2的对应路径是否存在 find "$pth1" -type f | while read -r file; do # 安全提取相对路径:先去掉pth1末尾可能存在的斜杠,再截取相对部分 rel_path="${file#${pth1%/}/}" # 如果这个相对路径还没被处理过 if [[ -z "${processed_paths[$rel_path]}" ]]; then # 构造pth2中的对应文件路径 counterpart="$pth2/$rel_path" if [[ -f "$counterpart" ]]; then echo "$rel_path exists in both $pth1 and $pth2" else echo "$rel_path exists in $pth1 but does NOT exist in $pth2" fi # 标记这个路径已处理 processed_paths[$rel_path]=1 fi done # 第二步:检查pth2中未被处理过的文件(也就是pth1中没有的文件) find "$pth2" -type f | while read -r file; do rel_path="${file#${pth2%/}/}" if [[ -z "${processed_paths[$rel_path]}" ]]; then echo "$rel_path exists in $pth2 but does NOT exist in $pth1" processed_paths[$rel_path]=1 fi done
咱们来拆解一下这个脚本的核心逻辑:
find "$pth1" -type f:递归遍历目录下的所有普通文件,不会把目录本身算进去,精准定位你要检查的文件。${file#${pth1%/}/}:这部分是关键的路径处理——先通过${pth1%/}去掉目录路径末尾可能存在的斜杠,再用参数展开截取掉目录前缀,得到文件相对于根目录的路径,这样就能对应到另一个目录的相同层级位置。- 关联数组
processed_paths:用来记录已经检查过的相对路径,避免像file1这种两边都有的文件被重复报告,让输出更简洁。 while read -r file:安全读取find的输出,能处理文件名包含空格、特殊字符的情况(除了换行符,不过一般文件名不会用换行)。
用你给出的示例目录结构测试的话,输出会是:
dirA/file1 exists in both /mntA/newpics and /mntB/oldpics dirA/DirB/file2 exists in /mntA/newpics but does NOT exist in /mntB/oldpics dirA/DirB/file3 exists in /mntB/oldpics but does NOT exist in /mntA/newpics
完全符合你想要的报告效果!
备注:内容来源于stack exchange,提问作者Estatistics
相关产品推荐
相关产品推荐

