Using diff command in unix to find the difference

时间:2017-11-13 06:36:18

标签: shell unix

I have two text files (new.txt and old.txt) which contains the recursively navigated directories.

new.txt

338465485   16 drwxr-x---  26 encqa2   encqa2      16384 Nov 13 06:04 ./
338465486    4 drwxr-x---   4 encqa2   encqa2       4096 Sep 19 08:38 ./excalibur
338465487    8 drwxr-x---   3 encqa2   encqa2       8192 Nov 11 14:33 ./excalibur/data_in
338465488    4 drwxr-x---   2 encqa2   encqa2       4096 Nov  9 23:16 ./excalibur/data_in/archive

old.txt

338101011   40 drwxr-x---  26 encqa2   encqa2      36864 Nov 13 06:05 ./
338101012    4 drwxr-x---   4 encqa2   encqa2       4096 Dec 14  2016 ./manual
338101013    4 drwxr-x---   2 encqa2   encqa2       4096 Aug 25  2016 ./manual/sorted
338101014    4 drwxr-x---   2 encqa2   encqa2       4096 Aug 25  2016 ./manual/archive
338101015    4 drwxr-x---   4 encqa2   encqa2       4096 Aug 25  2016 ./adp

338101016 4 drwxr-x--- 6 encqa2 encqa2 4096 Aug 25 2016 ./adp/0235

what I need is the only it provides me the directories , i.e

expected output after diff should be

./
./excalibur
./excalibur/data_in
./excalibur/data_in/archive
./excalibur/archive
./shares
./shares/data_in
./shares/data_in/archive
./shares/sorted

please provide me the command

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你想从两个不同的文本文件中获取这些行,但是从这些行中你只想输出目录名,而不是完整的信息。

如果你做了

diff {old,new}.txt

不同的行在输出中标记为'>'或者'<&#;在第一列中,通过grepping这些字符获得所需的行:

diff {old,new}.txt | grep '^[<>]' | ....

现在您只需要文件名。如果您确定您的路径不会包含任何空间,这是最简单的。在这种情况下,您可以将数据传输到:

... | grep -oE ' [^ ]+$' | cut -d ' ' -f 2 | ...

但是,如果文件名可以包含空格,则需要遵循不同的策略。例如,如果您知道每行中直到文件名的字符数始终相同,则可以使用cut -c ....来选择该行的最后部分。否则,您需要使用正则表达式处理每一行,该表达式描述您要丢弃的部分。我会在这种情况下使用Perl或Ruby,因为我对此最熟悉,但也可以使用其他工具--Zsh,awk,sed。

在此之后,您需要删除重复项。例如,如果new.txt和old.txt之间的行不在文件名部分中,而是在文件信息部分中,则可能会出现这些情况。这可以通过最终将所有内容连接到

来完成
.... | sort -u