Чтение онлайн

ЖАНРЫ

Искусство программирования на языке сценариев командной оболочки

Купер Мендель

Шрифт:

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 от полного имени файла и выводит только путь к файлу.

Утилитам basename и dirname может быть передана любая строка, в качестве аргумента. Этот аргумент необязательно должен быть именем существующего файла (см. Пример A-8).

Пример 12-28. Утилиты basename и dirname

#!/bin/bash

a=/home/bozo/daily-journal.txt

echo "Basename для /home/bozo/daily-journal.txt = `basename $a`"

echo "Dirname для /home/bozo/daily-journal.txt = `dirname $a`"

echo

echo "Мой домашний каталог `basename ~/`." # Можно указать просто ~.

echo "Каталог моего домашнего каталога `dirname ~/`." # Можно указать просто ~.

exit 0

split

Утилита разбивает файл на несколько частей. Обычно используется для разбиения больших файлов, чтобы их можно было записать на дискеты или передать по электронной почте по частям.

sum, cksum, md5sum

Эти утилиты предназначены для вычисления контрольных сумм. Контрольная сумма -- это некоторое число, вычисляемое исходя из содержимого файла, и служит для контроля целостности информации в файле. Сценарий может выполнять проверку контрольных сумм для того, чтобы убедиться, что файл не был изменен или поврежден. Для большей безопасности, рекомендуется использовать 128-битную сумму, генерируемую утилитой md5sum (message digest checksum).

bash$ cksum /boot/vmlinuz

1670054224 804083 /boot/vmlinuz

bash$ md5sum /boot/vmlinuz

0f43eccea8f09e0a0b2b5cf1dcf333ba /boot/vmlinuz

Обратите внимание: утилита cksum выводит контрольную сумму и размер файла в байтах.

Пример 12-29. Проверка целостности файла

Поделиться с друзьями: