diff директории a и b. показва само файлове в b, не и в a

заглавието обобщава въпроса ми. дадени директории a и b, искам да мога да генерирам списък с файлове, които са в b, но не и в a.

нормален diff прави това, но също така показва файлове в a, а не в b:

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

също така бих искал diff да изброява само имената на файловете - нито едно от нещата "Само в .."

Благодаря


person conor    schedule 27.03.2013    source източник


Отговори (3)


Опитайте тази

вземете едно от тези:

$ LANG=C diff -qr a b | awk -F"Only in b: " '/^Only in b:/{print $2}'

or

$ LANG=C diff -qr a b | grep -oP "^Only in b: \K.*"

or

$ LANG=C diff -qr a b | grep '^Only in b:' | cut -d: -f2-

Забележка

LANG=C

е там само за да се избегне показване на който и да е локален език, освен на английски.

Док

Вижте man diff

person Gilles Quenot    schedule 27.03.2013
comment
здравей, това не работи за мен. използвайки само LANG=C diff -aqr a b изброява разликите между двете директории.. опцията -a е за сравняване като текст? не искам да правя това, тъй като файловете, които сравнявам, не са текстови - person conor; 27.03.2013
comment
Да, това е за текст. Премахнат превключвател -a. Ако пак не работи, кажете ни какво точно не е наред. - person Gilles Quenot; 27.03.2013
comment
добре, изброява файлове в a, които не са в b, и файлове в b, които не са в a. според заглавието, искам да изброя само по-късните - файлове в b, които не са в a - person conor; 27.03.2013
comment
Прочетете по-внимателно отговора ми - person Gilles Quenot; 27.03.2013
comment
ах добре, извинения, тествах с първата половина на командата. работи сега, използвайки пълния ви отговор. Благодаря - person conor; 28.03.2013

Командата 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
% 

Та-да!

person Norman Gray    schedule 27.03.2013

Обикновено, когато трябва да направя това, отивам на нискотехнологични:

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

Това ми позволява да прецизирам резултатите. „О, опа, исках да изключа .svn директории от ~/a“, така че стартирайте отново файла ~/fooa без .svn директории и след това rediff.

person Andy Lester    schedule 27.03.2013