如何查找两个磁盘结构之间丢失的目录?
- 假设磁盘 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
和中的目录,并将这些列表与 进行比较。dir2
diff
答案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
从脚本中删除 。