我有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, --recursiveRecursively 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可以做到这一点,但我也懒得去检查。
尝试comm 。 comm -2 -3或comm -1 -2只会在文件A中给出行,或者只在文件B中给出行。