方法 1:comm
命令(推荐)
comm
可以比较两个已排序的文件,并输出三列:
- 第 1 列:只在第一个文件出现的行
- 第 2 列:只在第二个文件出现的行
- 第 3 列:两个文件共有的行
步骤:
bash
# 列出目录 A 的所有文件(相对路径)
find dirA -printf "%P\n" | sort > listA
# 列出目录 B 的所有文件(相对路径)
find dirB -printf "%P\n" | sort > listB
# 比较,找出 dirA 有而 dirB 没有的文件
comm -23 listA listB
# 找出 dirB 有而 dirA 没有的文件
comm -13 listA listB
说明:
-printf "%P\n"
输出相对路径,这样不同目录下的同名文件可以正确对比。sort
是必须的,因为comm
要求输入是已排序的。comm -23
表示不显示第 2 列和第 3 列,只显示 dirA 独有的内容。comm -13
表示不显示第 1 列和第 3 列,只显示 dirB 独有的内容。
方法 2:rsync
命令
bash
rsync -avn --delete dirA/ dirB/
说明:
-n
表示 dry run(模拟运行,不实际同步)--delete
会显示 dirB 中多出的文件(会被删除的部分)- 输出中:
>
开头的是 dirA 有而 dirB 没有的文件<
开头的是 dirB 有而 dirA 没有的文件*deleting
表示仅在 dirB 存在的文件
方法 3:diff
命令
bash
diff -rq dirA dirB
说明:
-r
递归比较子目录-q
只显示差异,不显示内容- 输出格式:plaintext
Only in dirA: xxx Only in dirB: yyy
总结推荐
- 如果只是找差异文件名:
comm + find
最精准且适合脚本处理 - 如果想同时看到差异方向:
rsync -avn --delete
直观 - 如果只是快速看:
diff -rq
最简单