如何查找两个磁盘结构之间丢失的目录?

如何查找两个磁盘结构之间丢失的目录?

如何查找两个磁盘结构之间丢失的目录?

  • 假设磁盘 A 有 dir A/, B/, C/, D/。 (较新的副本)
  • 假设磁盘 B 有 dir A/, B/, D/, E/。 (旧副本)

我想找出与旧副本相比,新副本中缺少哪些目录。

结果:“Dir E”。

我怎样才能做到这一点?我不想要任何有关文件的报告。

这可以仅创建特定目标中缺少的目录:

find -type d -exec mkdir -p "/mnt/pics/Albums/{}" \; 

更新:我的问题中建议的文章是关于内容而不是文件夹。此外,没有提出明确的解决方案作为“diff -rq path1 path2”的答案。

答案1

diff允许比较目录内容。用于-r递归遍历子目录并-q仅报告差异:

diff -rq /path/to/dir1 /path/to/dir2

例如:

$mkdir A B
$touch A/1 A/2 A/3 B/1 B/3 B/4
$diff -rq A B
Only in A: 2
Only in B: 4

请注意,这还会比较文件的相同内容!

答案2

一个相当方便的图形工具是meld.它可以在许多 Linux 发行版的存储库中找到。

您只需提供要比较的目录路径,如下所示

meld dir1/ dir2/

它将显示一个拆分树视图,指示哪些文件/目录仅存在于其中一个路径中,并且如果两个路径中都存在文件,则表明两个路径中的哪一个具有更新的时间戳。

答案3

通过bash,您可以使用:

diff <(cd dir1 && find -type d) <(cd dir2 && find -type d)

这将按字母顺序递归列出dir1和中的目录,并将这些列表与 进行比较。dir2diff

答案4

以下 shell 脚本采用两个参数:旧目录和新目录。它仅列出第一个参数中存在的目录,而第二个参数中不存在的目录。然而,它比其他解决方案更冗长一些。

#!/bin/bash
source_dir=$1
target_dir=$2

for folder_plus_path in $( find $source_dir -mindepth 1 -maxdepth 1 -type d ); do
  folder=${folder_plus_path#${source_dir}/}
  if [[ ! -d ${target_dir}/${folder} ]]; then
    echo ${folder}
  fi
done

就目前情况而言,上面只会列出缺失的目录立即地包含在第一个参数中(因此它会突出显示 A/E 不存在,但它不会检查 B/A/Subdir 是否也作为 A/A/Subdir 存在)。如果您还想检查这些子目录,请-maxdepth 1 从脚本中删除 。

相关内容