Как разнести несколько файлов по каталогам?

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

> diff d1/f.cpp d2/f.cpp

или я могу найти различия по каталогам:

> diff d1 d2 [ 119]

, но как мне найти различия только между файлами *.cpp?

> diff d1/*.cpp d2/*.cpp

, похоже, не работает (по понятным причинам).

[Вероятно, это легко решить с помощью циклов, но я пытаюсь найти более элегантный способ]

19
задан 15 July 2012 в 11:45

4 ответа

Вы можете использовать цикл оболочки, который запускает diff для каждого файла, хотя это не будет учитывать случаи, когда d2 содержит файл, а d1 - нет. Хотя этого может быть достаточно.

for file in d1/*.cpp; do
    diff "$file" "d2/${file##*/}"
done

Или все в одной строке:

for file in d1/*.cpp; do diff "$file" "d2/${file##*/}"; done

Часть ${file##*/} является расширением специального параметра.

Если переменная файла содержит d1/hello.cpp, то "${file##*/}" расширится до hello.cpp (значение файла, но со всем до, включая, последнее / удаленное).

Таким образом, "d2/${file##*/}" приведет к d2/hello.cpp, и результирующая команда diff будет diff d1/hello.cpp d2/hello.cpp

См. http://mywiki.wooledge.org/BashFAQ/100 [ 119] для более подробной информации о манипуляциях со строками в bash.

С другой стороны, система контроля версий (такая как subversion, git, mercurial и т. Д.) Значительно упростила бы этот тип различий.

0
ответ дан 15 July 2012 в 11:45

diff -qr {DIR1} {DIR2} делает все файлы в обоих каталогах.

  • q показывает только различия
  • r делает рекурсивные. Оставьте это, если вам не нужно это

Вы не можете напрямую указать diff использование подстановочных знаков, но вы можете добавить:

-x PAT  --exclude=PAT
    Exclude files that match PAT.

-X FILE    --exclude-from=FILE
   Exclude files that match any pattern in FILE.

для исключения файлов. Поэтому, если вы хотите только *.cpp, самый простой способ - это создать текстовый файл, содержащий все файлы, которые не *.cpp.

0
ответ дан 15 July 2012 в 11:45

Через некоторое время после того, как я задал вопрос, я обнаружил утилиту diff из meld и использую ее с тех пор. Это отличная программа на основе графического интерфейса, которая делает сравнение и объединение файлов и каталогов очень простой задачей. Он выполняет двух- или трехстороннее сравнение.

В частности, он отвечает на мой первоначальный вопрос в том, что он показывает сравнение содержимого каталога с цветовой кодировкой и позволяет сравнивать конкретные файлы двойным щелчком по имени файла.

Если требуется более чем трехстороннее сравнение, то gvimdiff (на основе редактора vim) также является отличным решением, обеспечивающим эту функциональность.

0
ответ дан 15 July 2012 в 11:45

Для этого есть простое решение:

  1. Установите этот крошечный плагин http://www.vim.org/scripts/script.php?script_id=5309 [ 112]
  2. Сделайте diff dir1 dir2 | vim -R - в оболочке

Это добавит сгибы и параллельное сравнение для измененных файлов.

0
ответ дан 15 July 2012 в 11:45

Другие вопросы по тегам:

Похожие вопросы: