我有 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 -3
或comm -1 -2
仅给出文件 A 中的行,或仅给出文件 B 中的行。