patch -p1 <patch-file
# Применит все изменения из '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 от полного имени файла и выводит только путь к файлу.