我如何得到“差异”只显示添加和删除行? 如果差异不能这样做,什么工具可以? 就拿-2

我有2个sorting的文件生成

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

我想从不同的/>备注中缺less的文件的文件名列表,没有任何<>注释,只有一个输出文件包含与/ tmp / backup中的logging完全相同的logging/invent.txt。

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

比较你的文件,然后使用awkfind你想要的行( /^< ), gsub(/^</,"")位( gsub(/^</,"") ),然后打印匹配的行。

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

所以,如果你想要一个class轮,你甚至可以做这样的事情。

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

不要使用diff ,而是使用join 。 由于您的input文件已经被sort ,下面的内容应该会产生你所要求的输出:

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

(如果/tmp/backup.txt/tmp/invent.txt的文件path包含空格,那么join可能无法正确使用上面给出的选项,在这种情况下,您将不得不使用-t选项,指定一个非空白字符作为连接的字段分隔符,你可能希望select字段分隔符作为实际上不出现在任何文件path中的字符,类似于|\可能就足够了。

 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. 手段 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 

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

尝试commcomm -2 -3comm -1 -2只会在文件A中给出行,或者只在文件B中给出行。