2016-05-15 3 views
1

Как использовать diff в терминале, но игнорировать изменения имен файлов?diff между папками, игнорируя изменения имени файла

В настоящее время это то, что я делаю:

diff -wrN folder1 folder2 | grep '^>' | wc -l 

Как я могу сделать мерзавец различий между двумя совершившим идентификаторами в то время как:

  • игнорируя файл переименовать
  • только посмотреть на ява файлы
  • игнорировать имена определенных папок, например папка 'a' и 'b'
  • выполнить grep '^>' | wc -l
+0

Что, на ваш взгляд, означает сравнивать папки, когда файлы не называются одинаковыми? Если папка1 содержит файлы a, b и c, а folder2 содержит x, y и z, какие файлы следует сравнивать с другими файлами? Следует ли сравнивать с z, или ... что? Как это должно работать? –

+1

Это репозиторий git, помогает ли это игнорировать изменения имени файла? – RegUser

+0

Это репозиторий git, но вы различаете состояния дерева и репозитория. Например, вы отличаетесь между текущим состоянием вашего рабочего дерева и некоторой фиксацией? Из того, что вы написали, похоже, что вы все еще различаете две папки, и неясно, что 'git' будет иметь для этого какое-то значение. 'git diff' имеет опцию' --find-renames', но неясно, работает ли это для вашего прецедента. –

ответ

0

Вы, похоже, не знаете о жесткости этой проблемы, поэтому я хотел бы указать, почему это так сложно.

Учитывая два каталога, которые равны в начале и оба содержат, скажем, 1000 файлов. Теперь вы переименовываете, скажем, 500 файлов в один из каталогов. Переименование может сильно различаться. Первоначально файл с именем foobar.txt можно назвать DSC-3457.orig.jpg. Команда diff не может действительно найти ее снова, не имея представления о том, что было переименовано в что.

Кроме того, файл с именем x может быть переименован в y, в то время как файл с именем y может быть переименован в x. В этом случае даже сомнительно, следует ли это рассматривать как простое переименование или просто передается содержимое обоих файлов.

Это означает, что в общем у вас возникнут большие проблемы для этого. Стандартные инструменты не будут делать это из коробки.

Это говорит о том, что у меня есть два аспекта, которые я хочу указать, что может вам помочь.

  1. файла Размеры

    Вы можете сортировать все файлы по размерам файлов, а затем diff каждая пара из двух каталогов. Это может работать отлично, если все изменения у вас есть только переименований, и если все файлы имеют разный размер. Если у вас есть несколько файлов одинакового размера (возможно, по чистой случайности или потому, что они имеют одинаковый формат с фиксированным размером), у вас снова возникают проблемы, и вам придется сравнивать каждую возможную пару одинакового размера группа.

  2. Git-Diff

    Вы упомянули git-diff в тегах. git фактически сохраняет запись в случае переименования файла. Поэтому, если вы намерены использовать git diff, вы можете в некоторой степени полагаться на способность git обнаруживать переименования. Обычно это работает, если файл удаляется и добавляется с новым именем в одном коммите. Если он добавляется с новым именем в одном коммите, а затем старая версия удаляется в другом коммите, это не будет работать должным образом. Намного больше узнать о переименованиях в git diff; см. man git diff и ищите rename, в этом случае есть около десятка мест, о которых упоминается, поэтому я не буду пытаться обобщить это здесь сам.

    EDIT: вы можете использовать команду, как git diff --find-renames --diff-filter=ACDMTUX (то есть вы позволяете всем видам изменений проходить фильтр, за исключением переименований).

+0

Спасибо вам большое! Я не понял. У меня есть две папки (проверьте выше комментарий), но я думаю, что лучше использовать оригинальную папку git и выполнить diff. Не могли бы вы посмотреть редактирование в вопросе? – RegUser

+0

Это всегда проблематично менять вопросы позже; он быстро становится бесконечной цепочкой ответов-ответов-ответов, и это не так, как должно работать SO. Вы должны опубликовать новый вопрос относительно вашей новой темы только «java-файлы». Для фильтрации всех действий по переименованию (то есть обнаруженных git), см. Мое изменение в моем ответе выше. – Alfe

+0

Извините, что .. спасибо! – RegUser

Смежные вопросы