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
答案 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