В общем случае, diffиспользуется для генерации файла различий, который используется как аргумент команды patch. Ключ -e отвечает за вывод файла различий в формате, пригодном для использования с edили ex.
patch: гибкая утилита для "наложения заплат". С помощью файла различий, сгенерированного утилитой diff, утилита patchможет использоваться для обновления устаревших версий файлов. Это позволяет распространять относительно небольшие "diff"-файлы вместо целых пакетов. Распространение "заплат" к ядру стало наиболее предпочтительным методом распространения более новых версий ядра Linux.
patch -p1
# Применит все изменения из 'patch-file'
# к файлам, описанным там же.
# Так выполняется обновление пакетов до более высоких версий.
Наложение "заплат" на ядро:
cd /usr/src
gzip -cd patchXX.gz | patch -p0
# Обновление исходных текстов ядра с помощью 'patch'.
# Пример взят из файла "README",
# автор не известен (Alan Cox?).
Кроме того, утилита diffв состоянии выполнять рекурсивный обход каталогов.
bash$ diff -r ~/notes1 ~/notes2
Only in /home/bozo/notes1: file02
Only in /home/bozo/notes1: file03
Only in /home/bozo/notes2: file04
Утилита zdiffсравнивает сжатые, с помощью gzip , файлы.
diff3
Расширенная версия diff, которая сравнивает сразу 3 файла. В случае успеха возвращает 0, но, к сожалению, не дает никакой информации о результатах сравнения.
bash$ diff3 file-1 file-2 file-3
====
1:1c
This is line 1 of "file-1".
2:1c
This is line 1 of "file-2".
3:1c
This is line 1 of "file-3"
sdiff
Сравнение и/или редактирование двух файлов перед объединением их в один файл. Это интерактивная утилита, по своей природе, и из-за этого она довольно редко используется в сценариях.
cmp
Утилита cmp-- это упрощенная версия diff. В то время, как diffвыводит подробную информацию об имеющихся различиях, утилита cmpлишь показывет номер строки и позицию в строке, где было встречено различие.
Подобно команде diff, команда cmpвозвращает код завершения 0, если файлы идентичны и 1, если они различны. Это позволяет использовать команду cmpв условных операторах.
Пример 12-27. Пример сравнения двух файлов с помощью cmp.
#!/bin/bash
ARGS=2 # Ожидаются два аргумента командной строки.
E_BADARGS=65
E_UNREADABLE=66
if [ $# -ne "$ARGS" ]
then
echo "Порядок использования: `basename $0` file1 file2"
exit $E_BADARGS
fi
if [[ ! -r "$1" || ! -r "$2" ]]
then
echo "Оба файла должны существовать и должны быть доступны для чтения."
exit $E_UNREADABLE
fi
cmp $1 $2 &> /dev/null # /dev/null -- "похоронит" вывод от команды "cmp".
# cmp -s $1 $2 даст тот же результат ("-s" -- флаг "тишины" для "cmp")
# Спасибо Anders Gustavsson за замечание.
#
# Также применимо к 'diff', т.е., diff $1 $2 &> /dev/null
if [ $? -eq 0 ] # Проверка кода возврата команды "cmp".
then
echo "Файл \"$1\" идентичен файлу \"$2\"."
else
echo "Файл \"$1\" отличается от файла \"$2\"."
fi
exit 0
Для работы с gzip файлами используется утилита zcmp.
comm
Универсальная утилита сравнения. Работает с отсортированными файлами.
comm -options first-file second-file
comm file-1 file-2-- вывод в три колонки:
колонка 1 = уникальные строки для file-1
колонка 2 = уникальные строки для file-2
колонка 3 = одинаковые строки.
Ключи, подавляющие вывод в одной или более колонках.
-1 -- подавление вывода в колонку 1
-2 -- подавление вывода в колонку 2
-3 -- подавление вывода в колонку 3
-12 -- подавление вывода в колонки 1 и 2 , и т.д.
Утилиты
basename
Выводит только название файла, без каталога размещения. Конструкция basename $0-- позволяет сценарию узнать свое имя, то есть имя файла, который был запущен. Это имя может быть использовано для вывода сообщений, напрмиер:
echo "Порядок использования: `basename $0` arg1 arg2 ... argn"
dirname
Отсекает basenameот полного имени файла и выводит только путь к файлу.
Читать дальше