6

标题总结了我的问题。给定目录 a 和 b,我希望能够生成 b 中但不在 a 中的文件列表。

一个普通的差异会这样做,但它也会显示 a 中的文件,而不是 b 中的文件:

$ diff -u /mnt/Media/a ~/b    
Only in /mnt/Media/a: abab
Only in /home/conor/b: blah

我还希望 diff 仅列出文件名 - 没有“仅在 ..”中的东西

谢谢

4

3 回答 3

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

于 2013-03-27T19:38:53.273 回答
5

uniq命令比您想象的更有用。考虑两个目录dirAdirB

% 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/f2dirB

创建两个目录的内容列表:

% (cd dirA; find . -type f >../listA)
% (cd dirB; find . -type f >../listB)

现在找到仅存在于的行listB

% cat listA listA listB | sort | uniq -u 
./s1/f1
% 

达达!

于 2013-03-27T20:05:57.197 回答
4

通常,当我必须这样做时,我会采用低技术:

cd ~/a
find . -type f | sort > ~/fooa
cd ~/b
find . -type f | sort > ~/foob
vimdiff ~/fooa ~/foob

它让我可以改进结果。“哦,哎呀,我想从 ~/a 中排除 .svn 目录”,所以重新运行不带 .svn 目录的 ~/fooa 文件,然后重新比较。

于 2013-03-27T20:14:16.093 回答