Зачем использовать diff/patch, если проще просто использовать cp

За исключениями движущихся разделов к другим устройствам и числам раздела, Clonezilla является потрясающим инструментом для создания сжатых резервных копий большого количества различных типов файловой системы. Нет ничего вполне как способность восстановить к точно, где Вы кончили каждым способом.

19
30.04.2019, 21:16
5 ответов

Решение таково:

paste -d "\0" a b
-121--47724-

Добавив к комментарию Джеффа, он повторяет предыдущую команду и, по крайней мере, на всех башиках, которые я использовал, также распечатает команду, чтобы увидеть, что вы только что сделали, что может объяснить cat textFileName , который вы видите. Этот вывод записывается на терминал, а не печатается на stdout или stderr. Например:

$ cat textFile
helloworld

$ !!
cat textFile
helloworld

$ !! &>/dev/null
cat textFile &>/dev/null

Так что печатаемая строка просто отображается вам для вашей помощи, это не часть выходных данных, которые бы появились, скажем, в конвейере, если бы вы использовали !!

-121--228931-

Различия могут быть более сложными, чем просто сравнение одного файла с другим. Может сравнивать всю иерархию каталогов. Рассмотрим пример исправления ошибки в GCC. Мое изменение добавляет строку или две в 4 или 5 файлов и удаляет несколько строк в этих и других файлах. Если я хочу сообщить об этих изменениях кому-либо, потенциально для включения в GCC моими опциями являются

  • Копировать все исходное дерево
  • Копировать только те файлы, которые были изменены
  • Предоставить только те изменения, которые я сделал

Копирование всего исходного дерева не имеет смысла, но как насчет двух других вариантов, которые становятся основой вашего вопроса. Теперь учтите, что кто-то другой также работал над тем же файлом, что и я, и мы оба отдаем свои изменения кому-то. Как этот человек узнает, что мы сделали и совместимы ли изменения (различные части файла) или конфликтуют (одни и те же строки файла)? Он разделит их! Дифф может рассказать ему, чем файлы отличаются друг от друга и от немодифицированного исходного файла. Если дифф - это то, что нужно, просто имеет больше смысла просто отправить дифф в первую очередь. Diff также может содержать изменения из нескольких файлов, поэтому, пока я редактировал всего 9 файлов, я могу предоставить один файл diff для описания этих изменений.

Diffs также может использоваться для предоставления истории. Что если изменение три месяца назад вызвало ошибку, которую я обнаружил только сегодня. Если я могу сузиться при появлении ошибки и изолировать ее для конкретного изменения, я могу использовать diff для «отмены» или возврата изменения. Это не то, что я мог бы сделать так же легко, если бы копировал только файлы вокруг.

Все это связано с системой управления версиями, в которой программы могут записывать историю файлов как серию изменений с момента ее создания до сегодняшнего дня. Diffs предоставляют историю (я могу воссоздать файл, как это было в любой конкретный день), я могу увидеть, кто виноват в том, что сломал что-то (у diff есть владелец), и я могу легко отправить изменения в родительские проекты, дав им конкретные diffs (может быть, они заинтересованы только в одном изменении, когда я сделал много).

В целом, да, cp проще, чем diff и patch , но полезность diff и patch больше, чем cp для ситуаций, когда изменение файлов важно для трека.

31
27.01.2020, 19:44

Если вы используете diff, вы можете увидеть, что именно изменилось, поэтому использование diff/patch - это способ предотвратить проскальзывание кем-либо нежелательных изменений в файле.

12
27.01.2020, 19:44

Поместите этот файл в файл .sh и сделайте его исполняемым ( chmod + x filename ):

#!/bin/bash

mv "$1" "$2"
ln -s "$2" "$1"

Пример использования:

./test.sh asdf otherdir/asdf

Обратите внимание, что проверка безопасности не выполняется и т.д. В зависимости от того, насколько сложна ваша задача, этого может быть достаточно.

-121--27450-

Вы правы, синтаксис оболочки допускает только что-то вроде

'# >'

, где # является одной цифрой.

Оболочка может поддерживать многозначные числа, но поведение не определено POSIX.

Быть возможность выполнения расширения переменной здесь выходит далеко за пределы указанного синтаксиса.

Однако можно использовать eval для расширения текста и повторного вызова синтаксического анализатора.

-121--139106-

Изменения, внесенные в файлы, обычно намного меньше, чем изменяемые файлы.

Это означает, что хранение diff может сэкономить много места. При создании diff дисковое пространство обходилось дорого.

Но это также означает, что вы можете повторно применить diff к файлу, даже если этот файл изменился другими способами. Утилита patch сделает это для вас и сообщит, когда возникнут проблемы.

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

Между тем, различные изменения могут быть сделаны, возможно, другим разработчиком, даже в другом месте. Если изменения не были внесены в одни и те же части одних и тех же файлов, их можно применить независимо. Чтобы разработчики могли отправлять друг другу свои патчи для тестирования. Может создаваться полный набор исправлений, который представляет возможные изменения; некоторые из них могут быть в конечном итоге отклонены, остальные будут интегрированы в систему.

Таким образом, работа с диффами позволяет осуществлять параллельную разработку. Вам больше не нужно работать над одним изменением за раз.

Современные распределенные системы управления версиями являются продолжением этого способа работы.

11
27.01.2020, 19:44

Короче может. Если вы посмотрите несколько видеороликов Thinkg Big Larry Wall на YouTube, он расскажет о том, как начали работать diff / patch и какие проблемы они решили, и, по сути, речь шла об уменьшении размера для связи через Интернет при сохранении гибкости и удобочитаемости исправлений. .

Если вы работаете в локальной системе и ничего из этого не интересует, то cp или rsync подойдут.

1
27.01.2020, 19:44

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

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

До (контекстная/унифицированная) разница в том, что это часто делалось с инструкциями для редакторов (вставить строку после X, удалить строку Y), но это сработает только в том случае, если вы знаете, с какого состояния начиналась эта инструкция. Таким образом, при простом копировании возникает та же проблема, что и при вашем "решении".

20
27.01.2020, 19:44

Теги

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