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, которых нет в - 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, а затем повторите попытку.

person Andy Lester    schedule 27.03.2013