如何让“diff”仅显示添加和删除的行?如果 diff 无法做到这一点,那么什么工具可以做到?Take-2

如何让“diff”仅显示添加和删除的行?如果 diff 无法做到这一点,那么什么工具可以做到?Take-2

我有 2 个由以下人员生成的排序文件

xxx>find /store -type f -print | sort> /tmp/invent.txt
xxx>find /fbkup -type f -print | sort > /tmp/backup.txt

我想要从 diff 中获得 /store 中缺失但仍在 /backup 上的文件的文件名列表,没有任何 < > 注释,只有一个输出文件,其中包含与 /tmp/backup 完全相同的记录,但在 /tmp/invent.txt 上没有匹配项。

xxx>diff -??? /tmp/invent.txt /tmp/invent.txt | xargs ...

答案1

比较您的文件,然后使用 awk 找到您想要的行(/^<),删除前导位(gsub(/^</,"")),并打印匹配的行。

diff file1 file2 | awk '/^</ {gsub(/^</,""); print}'

因此,如果您想要一行代码,您甚至可以做这样的事情。

diff <(cd /store ; find . -type f -print | sort) \
     <(cd /fbkup ; find . -type f -print | sort) | \
     awk '/^</ {gsub(/^</,""); print}'

答案2

不要使用diff,使用join相反。由于您的输入文件已经sort编辑,因此以下内容应准确生成您请求的输出:

join -v 2 /tmp/invent.txt /tmp/backup.txt > /tmp/in-backup-but-not-invent.txt

/tmp/backup.txt(如果或中的文件路径/tmp/invent.txt包含空格,则join可能无法正确使用上面给出的选项。在这种情况下,您必须考虑使用选项-t,指定非空格字符作为 的字段分隔符join。您可能希望选择一个实际上未出现在任何文件路径中的字符作为字段分隔符。像|或这样的选项\可能就足够了。)

答案3

for i in `cat /tmp/invent.txt`; do grep ^$i$ /tmp/backup.txt >/dev/null || echo $i ; done

这将列出echo所有/tmp/invent.txt不在的名称/tmp/backup.txt

编辑

我找到了另一种方法diff:-( diff -r dir1 dir2)

-r, --recursive 方法 Recursively compare any subdirectories found.

$ mkdir -p dir1/dir dir2/dir/dir

$ diff -r dir1 dir2
Only in dir2/dir: dir

$ touch dir1/file{a..d}

$ touch dir2/file{a..d}

$ touch dir2/dir/file{a..d}

$ echo hi >  dir2/filea

$ diff -q -r dir1 dir2
Only in dir2/dir: dir
Only in dir2/dir: filea
Only in dir2/dir: fileb
Only in dir2/dir: filec
Only in dir2/dir: filed
Files dir1/filea and dir2/filea differ

答案4

Diff 可能可以做到这一点,但我懒得检查。

尝试comm.comm -2 -3comm -1 -2仅给出文件 A 中的行,或仅给出文件 B 中的行。

相关内容