标题是我的问题。给定目录a和b,我希望能够生成b中但不在a中的文件列表。
普通的差异可以做到这一点,但它也会显示不在b中的文件:
$ diff -u /mnt/Media/a ~/b
Only in /mnt/Media/a: abab
Only in /home/conor/b: blah
我也想让diff只列出文件名 - 没有“只在...中”的东西
感谢
答案 0 :(得分:8)
选择其中一项:
$ LANG=C diff -qr a b | awk -F"Only in b: " '/^Only in b:/{print $2}'
或
$ LANG=C diff -qr a b | grep -oP "^Only in b: \K.*"
或
$ LANG=C diff -qr a b | grep '^Only in b:' | cut -d: -f2-
LANG=C
只是为了避免以任何语言环境显示,而是用英语显示。
请参阅man diff
答案 1 :(得分:5)
uniq
命令比您想象的更有用。考虑两个目录dirA
和dirB
:
% ls -R dirA dirB
dirA:
s1/ s2/
dirA/s1:
f2
dirA/s2:
f1 f2
dirB:
s1/ s2/
dirB/s1:
f1 f2
dirB/s2:
f1
%
s1/f1
中缺少文件dirA
,s2/f2
中缺少文件dirB
。
创建两个目录的内容列表:
% (cd dirA; find . -type f >../listA)
% (cd dirB; find . -type f >../listB)
现在在listB
中找到仅的行:
% cat listA listA listB | sort | uniq -u
./s1/f1
%
钽DAH!
答案 2 :(得分:3)
通常,当我必须这样做时,我会走低技术:
cd ~/a
find . -type f | sort > ~/fooa
cd ~/b
find . -type f | sort > ~/foob
vimdiff ~/fooa ~/foob
它让我可以改进结果。 “哦,哎呀,我想从〜/ a中排除.svn目录”,所以重新运行没有.svn目录的〜/ fooa文件然后重新加载。