#bash #version-control #find #diff
#bash #контроль версий #Найти #разница
Вопрос:
Признаю, что это не очень хорошая ситуация, но иногда вы обнаруживаете, что одни и те же служебные скрипты (или что-то вроде Makefile
них) были зарегистрированы в разных каталогах в одном и том же или разных репозиториях для одного и того же или разных проектов. Возможно, они даже были зарегистрированы в каталогах с несогласованными именами или каталогах проекта, находящихся на разных уровнях исходного дерева.
Как я могу найти файлы с одинаковым именем и (возможно) одинаковым назначением, которые находятся в разных каталогах, и легко определить, какие из них одинаковые, какие разные и в чем различия?
Ответ №1:
Для Makefile
примера предположим, что кто-то работает в одиночку над новым и улучшенным вариантом ProjectX и обновил Makefile для автоматизации ранее выполнявшейся вручную задачи. Вы несете ответственность за то, чтобы остальные старые проекты соответствовали требованиям, но кто-то, возможно, уже выполнил некоторые обновления.
Вы могли бы использовать приведенный ниже скрипт для запуска diffTree.sh Makefile
и получения следующего вывода:
bash$ diffTree.sh Makefile
diff ./newprojects/projectX/Makefile ./projectB/Makefile
1,2d0
< CONFIGPARAM = "foo"
17c5
< echo "I did that thing for you"
---
> echo "You should do that thing"
diff ./projectB/Makefile ./projectC/Makefile
diff ./projectC/Makefile ./projectD/Makefile
end of files
bash$ _
Это говорит о том, что ProjectB и C и D все идентичны, но newprojects / ProjectX / Makefile отличается от B, и, следовательно, также одинаково отличается от C и D.
Если все файлы в разных местах с одинаковыми именами одинаковы, вы получите что-то вроде этого:
bash$ diffTree.sh sameFile.h
diff ./newprojects/projectX/src/headers/sameFile.h ./projectB/src/headers/sameFile.h
diff ./projectB/src/headers/sameFile.h ./projectC/src/headers/sameFile.h
diff ./projectC/src/headers/sameFile.h ./projectD/src/headers/sameFile.h
end of files
bash$ _
Если вы укажете имя файла, которого вообще не существует в дереве, вы получите:
bash$ diffTree.sh foo
end of files
bash$ _
Вот скрипт:
#!/usr/bin/env bash
set `find . -name $1 -print ; echo no files`
while [[ $# -gt 1 ]]
do
if [[ $2 = no amp;amp; $3 = files ]]
then
shift
else
echo diff $1 $2
diff $1 $2
fi
shift
done
echo end of files
Похоже, что он обрабатывает подстановочные знаки в имени файла, но, вероятно, нужно что-то сделать, чтобы сделать это безопаснее. Аналогично, было бы улучшением разрешить параметры различий, такие как «игнорировать пробелы» и так далее.
Очевидно, что это полностью прерывается, если у вас есть файл с именем ‘no’, а второй файл с именем ‘files’ появляется в середине вывода команды ‘find’, но поскольку все имена файлов имеют префикс ‘./’, а ‘no’ следует после ‘files’ в алфавитном порядке, я думаю, что это достаточно безопасно.