Я пытаюсь найти diff
между всеми файлами с одинаковыми именами в двух копиях каталога (скажем, рабочей и резервной копии). Например, я могу diff
два файла с одинаковыми именами в обоих:
> diff d1/f.cpp d2/f.cpp
или я могу найти различия по каталогам:
> diff d1 d2
[ 119]
, но как мне найти различия только между файлами *.cpp
?
> diff d1/*.cpp d2/*.cpp
, похоже, не работает (по понятным причинам).
[Вероятно, это легко решить с помощью циклов, но я пытаюсь найти более элегантный способ]
Вы можете использовать цикл оболочки, который запускает 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
С другой стороны, система контроля версий (такая как subversion, git, mercurial и т. Д.) Значительно упростила бы этот тип различий.
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
.
Через некоторое время после того, как я задал вопрос, я обнаружил утилиту diff из meld
и использую ее с тех пор. Это отличная программа на основе графического интерфейса, которая делает сравнение и объединение файлов и каталогов очень простой задачей. Он выполняет двух- или трехстороннее сравнение.
В частности, он отвечает на мой первоначальный вопрос в том, что он показывает сравнение содержимого каталога с цветовой кодировкой и позволяет сравнивать конкретные файлы двойным щелчком по имени файла.
Если требуется более чем трехстороннее сравнение, то gvimdiff
(на основе редактора vim
) также является отличным решением, обеспечивающим эту функциональность.
Для этого есть простое решение:
diff dir1 dir2 | vim -R -
в оболочке Это добавит сгибы и параллельное сравнение для измененных файлов.