Жанр: Учеба

Приемы профессиональной работы в Unix

сторінка №8

текст программы.
Прежде чем начнет выполняться поиск файлов, на экран выводится
имя временного файла, чтобы вы знали, как обратиться к нему после завершения
выполнения команды. Все результаты, полученные после обработки
файлов, направляются в этот один файл. Командный файл pall также
выводит на экран сообщения, когда он обрабатывает файлы. Вывод файлов
выполняется в реальном времени по мере обработки файлов. Распечатка
производится при помощи обычной команды UNIX'а file. По распечатке вы
можете судить о том, файлы какого типа обрабатываются в данный момент.
Если какой-либо норовистый файл проскользнет, то вы знаете, где он
размещен и какого он типа. Это делает отладку гораздо более простой.
Для файлов выполняется обработка, которая является действием по
умолчанию команды pr. Она разбивает файл на страницы и ставит заголовок
в начале каждой страницы. Заголовок содержит дату, имя файла и номер
страницы. Нет никакого иного способа передать заголовок командному
файлу pall во время его работы, поскольку он предполагает, что вы хотите
знать имя каждого файла таким, как оно есть на диске. Изменение
строки заголовка вызвало бы только неприятности и дополнительную работу.

Способ вызова pall влияет на формат имени файла в заголовке. Если
вы вызвали pall, используя абсолютное имя каталога, то в распечатке
используются полные маршрутные имена. Если вы вызвали pall с относительными
маршрутными именами, то они и используются при выводе на печать.
Внутри pall используется команда find системы UNIX. Команда find
использует данные из командной строки, т.е. те, которые ввел пользователь.
Выводимый заголовок изменяется в зависимости от того, что указано
в командной строке, которую использует find. Если вы вызываете
pall, используя следующую командную строку, то заголовок содержит полное
маршрутное имя:

---------------------------------------------------------------------------

|
| $ pall /usr/include
|
| May 5 10:39 1986 /usr/include/a.out.h Page 1
| .
| .
| .
| May 5 10:39 1986 /usr/include/ar.h Page 1
| .
| .
| .

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

---------------------------------------------------------------------------

|
| $ cd /usr/include
| $ pall .
|
| May 5 10:39 1986 ./a.out.h Page 1
| .
| .
| .
May 5 10:39 1986 ./ar.h Page 1
ПРИМЕРЫ

1. $ pall /usr/include

Выводит ВСЕ файлы заголовков. Сюда включаются файлы заголовков в
подкаталоге sys и во всех других каталогах, которые могут располагаться
ниже каталога /usr/include. Это и есть причина, по которой был
написан командный файл pall. Он создает один огромный листинг всех
файлов заголовков в отсортированном порядке с печатью в заголовке
страниц полного имени.

2. $ pall $HOME/src

Обходит все каталоги, находящиеся ниже каталога исходных текстов,
и распечатывает все файлы.


ПОЯСНЕНИЯ

В самом начале производится проверка на наличие ошибок в командной
строке. Если в ней нет аргументов или их больше двух, выводится
сообщение об ошибке, синтаксическая подсказка и программа завершается
с неудачным статусом возврата.
В строке 12 инициализируется переменная NAME. Это действие выполняется
по умолчанию, поэтому данная строка дает возможность не указывать
опцию в командной строке. Оператор if в строке 13 означает: "Если
первым символом первого аргумента является дефис", то нужно проверить,
какая это опция.
Если установлена опция -t, то переменная NAME инициализируется
нулевым значением, что совпадает с действием по умолчанию, поэтому на
самом деле ничего не меняется. Затем эта опция удаляется из командной
строки.
Если установлена опция -d, то переменная NAME инициализируется
для поиска символьной строки, соответствующей именам файлов программной
разработки. Обратите внимание, что двойные кавычки внутри оператора
экранированы, т.е. впереди них стоят символы наклонной черты. Командный
интерпретатор shell воспринимает кавычки вокруг строки поиска
на первой фазе синтаксического разбора без отмены присвоения, тем самым
оставляя двойные кавычки последующей команде find.
Если опцией является что-либо другое, выводится сообщение об
ошибке и программа завершается.
В строке 27 выводится сообщение о том, какой файл содержит результаты
работы. Сам этот оператор не создает файл. Он только печатает
имя файла, который будет создан позже.
Строки 29-43 - это главный цикл всей программы. Оператор find
должен быть повторно проанализирован командой eval, поскольку переменная
NAME содержит нужные нам данные. Если бы не было команды eval, то
подстановка символьных строк выполнялась бы неправильно. Обратите внимание,
что переменной NAME не требуются кавычки в строке 24. Они уже
есть в переменной NAME, так как были обработаны командой eval.
Оператор find находит только файлы типа f, или обычные файлы,
т.е. не каталоги и не символьные или блочные устройства. Здесь под
"обычными файлами" понимается, что они еще могут быть файлами данных
или исполняемыми. Если значение переменной NAME равно нулю, оно не
влияет на командную строку. Если NAME содержит символы файлов программной
разработки, то они становятся частью команды find при выполнении
команды eval. Это накладывает ограничения на шаблон поиска команды
find. Когда файлы найдены, их имена выводятся в стандартный вывод.
Стандартный вывод по конвейеру передается команде sort, располагающей
имена файлов по порядку. Это сильно помогает при сортировке горы выводной
информации. Чтение кипы распечаток толщиной в один фут может
свести с ума кого угодно.
Отсортированные имена по конвейеру передаются в цикл while, который
читает имена файлов по одному. Обратите внимание, что стандартный
вывод для всего цикла while переадресовывается во временный файл, что
облегчает сборку всех выходных результатов в одном месте вместо переадресации
каждого вызова команды в файл.
Для каждого подходящего файла выполняется проверка в строках
31-36. Проверка начинается с запуска команды file. Выход file по конвейеру
передается команде egrep, которая ищет тип файла, соответствующий
набору нескольких выражений. Если какое-либо выражение подходит,
то нам не нужно обрабатывать этот файл. Это не текстовый файл, и его
нельзя вывести на принтер. Во многих случаях файлы данных содержат
большое количество символов прогона формата, которые выталкивают страницу
после каждой пары символов. Если вы не будете находиться рядом с
принтером, когда печатаются такие файлы, то вы можете получить
листинг, занимающий половину ящика бумаги, затратив целый лес на ненужную
работу.
Нам не нужен выход команды egrep, а только ее статус возврата.
Если egrep обнаруживает одно из указанных ей выражений, она завершается
со статусом успеха, или 0. Тем самым проверка if включает выполнение
оператора then, который в данном случае выводит нас из конструкции
if-then-else и продолжает цикл while, пропуская таким образом
файл.
Если же egrep не обнаружила ни одну из указанных символьных
строк, то выполнение продолжается с оператора else, который выполняет
еще одну команду file и переадресовывает ее вывод на устройство с именем
/dev/tty. Это универсальное имя устройства, которое гарантирует
вам вывод на экран вашего терминала. UNIX обеспечивает, что указание
/dev/tty обходит любые команды переадресации вывода, действующие в
данный момент. Поскольку стандартный вывод уже переадресован для всего
цикла while, то нам нужно попасть на устройство /dev/tty, чтобы вывод
шел на экран терминала, а не в файл печати. Отображение на терминал
имени обрабатываемого файла позволяет пользователю знать, какой файл
будет добавлен к распечатке.

Если файл удовлетворяет нашим критериям, он обрабатывается командой
pr. Результат направляется в стандартный вывод, который переадресован
циклом while так, чтобы результат четко попадал в один файл.
Отметим, что нам нужно поставить символ добавления в файл вывода ("").
В противном случае мы получим запись на место существующего файла печати,
а значит в файле печати будет находиться только последний обработанный
файл.
После того как все файлы обработаны, задается вопрос о том, хотите
ли вы вывести результирующий файл на печать. Предлагается ответить
на этот вопрос "да" (yes) или "нет" (no), однако в программе проверяется
только положительный ответ (yes). Это значит, что нажатие любой
клавиши трактуется как ответ "no", кроме клавиши "y", означающей "да".
Ответ пользователя читается с клавиатуры, и проверяется, является ли
он символом "y". Если да, то файл ставится в очередь на печать. Если
нет, дальнейшая проверка не производится и командный файл завершается.
Отметим, что запрос о выводе на печать поступил в стандартный вывод.
Переадресация вывода действовала только во время работы цикла
while, а затем прекратилась. Так было сделано потому, что цикл while
был фактически еще одним порожденным shell-процессом (subshell) и переадресация
действовала только в этом те внимание, что маршрутнаяустановите
значения переменных вне цикла, а затем измените их внутри
цикла. После завершения цикла переменные по-прежнему имеют свои первоначальные
значения, а не измененные в цикле значения. Измененные значения
касались переменных порожденного интерпретатора shell, которые
исчезли, когда порожденный shell завершился. Переменные интерпретатора
shell могут передавать значения только вниз, порожденным процессам, но
процессы-потомки не могут передавать значения переменных вверх, родительскому
процессу. Обычно передача значений переменных поддерживается
при помощи какого-либо файла, в котором хранятся данные для обмена
между родительским процессом и процессом-потомком.

УПРАВЛЕНИЕ ВЫВОДНЫМИ ФАЙЛАМИ БОЛЬШИХ РАЗМЕРОВ

Как мы уже отмечали, общий размер выводного файла ограничен. Напомним,
что команда find проходит все дерево каталогов вниз до конца
по всем поддеревьям, начиная с каталога, имя которого указано в командной
строке. Если вы находитесь на вершине очень глубокого дерева,
то обрабатываться могут буквально сотни файлов. Поскольку вы ограничены
максимальным размером выводного файла, вы можете обработать только
ограниченное число файлов. Конечно, количество файлов, которое вы можете
обработать, зависит также от того, насколько велики входные файлы.

Если выводной файл достигает своего максимума, все добавляемые
после этого данные теряются. Потеря данных весьма болезненна, и обычно
требуется некоторое время, чтобы ее обнаружить. В медленно работающей
системе попытка обработать большое дерево, например все исходные
тексты системы UNIX, может занять целый час и даже больше, прежде чем
выходной файл заполнится. Это означает, что вы должны находиться рядом
и следить за тем, когда файл переполнится. Если он все-таки переполнился,
вы должны все выбросить и начать сначала. Это также означает,
что вы должны перейти вниз по дереву. Это может быть проблемой в сбалансированных
деревьях.
Например, рассмотрим каталог /usr/lib. Этот каталог содержит много
файлов на первом уровне и много каталогов первого уровня. Если бы
мы не обработали все файлы каталога /usr/lib за одну попытку, мы должны
были бы пойти вниз по подкаталогам каталога /usr/lib. Попытки делать
это вручную и запускать pall в каждом подкаталоге заняли бы много
времени и могли бы привести к ошибкам с вашей стороны. Кроме того,
pall допускает указание только одного имени каталога, что приведет к
получению большого количества распечаток и к путанице при их сортировке.

Что же делать? Радикальным решением является увеличение значения
ulimit. Вы можете сделать это либо с помощью программы на языке Си,
использующей системный вызов ulimit, либо командой shell'а ulimit.
Техника выполнения такой работы представлена в главе 7.

ВОЗМОЖНЫЕ МОДИФИКАЦИИ

Возможно, вы захотите добавить свои собственные штрихи в некоторых
местах командного файла. Первым местом является то, где указываются
символы поиска файлов программной разработки. Символы, использованные
нами - это наиболее употребимые суффиксы в UNIX. Если вы
используете не Си и ассемблер, а другие языки, то вы можете добавить
соответствующие символы.
Следующим местом, где могут быть сделаны дополнения, являются опции,
которые может понимать pall. Вам могут понадобиться файлы с определенными
именами или определенными типами, например, файлы nroff. Эти
опции могут быть легко добавлены в оператор case, что улучшит команду.

Последним местом возможных изменений является тип файлов, которые
нужно пропускать. Символьная строка для команды egrep покрывает большинство
важных нетекстовых типов файлов. В вашей системе могут быть
какие-то особые типы или же имена могут быть другими. Если вам необходимо
дополнить строку, сделайте это. Команда egrep может обработать
довольно много информации. Я не знаю ее ограничений. Возможно, вы обнаружите
их, просматривая исходный текст утилиты egrep. Если получается
слишком длинная строка и не помещается на экране, ничего страшного.
Перенос на следующие строки экрана не опасен, пока общее количество
символов не превысит 255. Опасно только указывать переадресацию
символьной строки if на нулевое устройство в следующей после команды
egrep строке. Кажется, что все работает правильно, но это не так. Переадресация
должна указываться в той же строке, где стоит команда
egrep.
В данной главе сделано очень много. Наиболее важно то, что получено
множество новых идей, которые можно использовать при эксплуатации
программной среды и просмотре файлов любого типа. В следующей главе мы
углубимся в рутинную работу по ежедневному сопровождению файлов и
используем изученные средства, чтобы они облегчили нашу жизнь.

* ГЛАВА 3. Поддержка файловой системы * ВВЕДЕНИЕ
3.1. СОПРОВОЖДЕНИЕ ФАЙЛОВ
3.1.1. Операции сопровождения
3.1.2. Средства пересылки файлов
3.1.3. Средства копирования
3.1.4. Средства проверки операции копирования
3.2. ПЕРЕСЫЛКА ФАЙЛОВ
3.2.1. cptdir - копирование дерева каталога
3.2.2. can - удаление файлов в "мусорную корзину"
3.2.3. dosflp - копирование файлов с гибкого диска формата MS-DOS
с использованием символов шаблона в именах файлов
3.3. СРЕДСТВА ПОЛУЧЕНИЯ РЕЗЕРВНЫХ КОПИЙ
3.3.1. autobkp - автоматически наращивамый файл резервной копии
3.3.2. cpiobr - копирование и восстановление файлов в виде потока
данных
3.4. СРЕДСТВА ПРОВЕРКИ ОПЕРАЦИЙ КОПИРОВАНИЯ
3.4.1. dsum - контрольные суммы двух катологов
3.4.2. log - меню доступа к файлам протокола копирования

ВВЕДЕНИЕ

Даже "небольшая" система UNIX с малым числом пользователей порож-
дает сотни файлов в ходе обычной работы. В процессе программирования вы
можете создавать множество файлов для различных версий ваших программ.
Ведение почты и запись текста при помощи редактора vi способствует то-
му, что накапливается еще больше файлов. Такие утилиты, как uucp, lp и
другие добавляют еще больше файлов. Если у вас система UNIX установлена
на микро-ЭВМ, то ваш жесткий диск начинает переполняться. В больших
многопользовательских системах дисковая память редко считается пробле-
мой, но в действительности всегда кажется, будто файлы стремятся расши-
риться до заполнения всей доступной дисковой памяти. Поэтому каждый
пользователь должен нести ответственность за расход дискового прост-
ранства. (Если вы платите за дисковую память, то у вас также могут быть
финансовые стимулы.) Однако, то, что вы хотите сохранить, вы хотите
СОХРАНИТЬ. Именно здесь начинается работа по созданию резервных копий.

3.1. СОПРОВОЖДЕНИЕ ФАЙЛОВ

В предыдущей главе мы разработали некоторые средства поиска и
отображения информации, помогающие нам поддерживать жизненный путь всех
наших файлов. Теперь мы собираемся обратиться к важнейшим рутинным ра-
ботам, которые позволят избежать хаоса и катастрофы.
Сопровождение файлов означает избавление от файлов, которые нам
больше не нужны и в то же время систематическое копирование тех файлов,
которые мы хотим сохранить. Для этого требуется возможность использова-
ния разнородных доступных носителей данных. Сопровождение файлов подра-
зумевает также ряд систематических, повторяющихся задач, а это означа-
ет, что мы можем создать средства системы UNIX для автоматизации этого
процесса.

3.1.1. ОПЕРАЦИИ СОПРОВОЖДЕНИЯ

Сопровождение файлов включает два вида операций: создание резерв-
ных копий (копирование) и удаление "мусора".
Копирование - это дань уважения, которую мы платим за хрупкость
физических данных в руки Мерфи и других богов энтропии. Хорошее
средство копирования является быстрым, гибким, простым в использовании
и стимулирует пользователей часто копировать самые важные файлы. В
последующем тексте будут представлены различные методы копирования,
пригодные для разных конфигураций системы и типов носителей.

Имеется два вида резервных копий: "мягкие" и "твердые". "Мягкие"
резервные копии - это копии в другом файле или каталоге в той же или в
другой файловой системе (т.е. разделе) на том же или другом жестком
диске. Такого рода копирование сделать легко и оно предохраняет от на-
носимого самому себе ущерба, такого как удаление файла по невниматель-
ности. Чаще всего для такого типа копирования используется наше
средство cptdir. Основной недостаток мягкого копирования заключается в
том, что вы по-прежнему уязвимы для таких воздействий, которые влияют
на ваш физический носитель (обычно жесткий диск) так, что и оригинал и
копия оказываются разрушенными.
"Твердая" копия - это копия на другом устройстве или даже в другой
системе UNIX. Средства, представленные ниже в данной главе, управляют
такого рода копированием и дают вам возможность выполнять копирование
такого типа и с такой периодичностью, которые соответствуют объему ва-
шей вычислительной системы, уровню ее активности и важности хранимых
данных.
Твердое копирование всегда несколько утомительно, потому что диски
или ленты должны быть смонтированы (или должна быть установлена связь с
другой системой), а эта операция требует много времени. Преимущество,
естественно, заключается в том, что вы больше не зависите от целост-
ности какого-либо одного устройства.
Автоматизируя нашу процедуру копирования, мы стараемся сделать его
как можно менее болезненным. Делая наши средства копирования в какой-то
степени разумными, мы можем выбрать только файлы, которые нуждаются в
копировании, и тем самым сохранить время и память. Наилучший способ
обеспечить, чтобы копирование выполнялось регулярно - минимизировать
время и требуемые для этого усилия. Наконец, создание процедур для про-
верки правильности копий даст вам спокойствие духа.
"Удаление мусора" можно автоматизировать путем указания и подго-
товки к удалению файлов, которые, вероятно, будут временными, либо ка-
ких-то других файлов, которые созданы (но не обязательно разрушены) при
компиляции, выполнении конвейеров или другими операциями. Вы также мо-
жете указывать файлы, специфичные для ваших работ как не подлежащие
удалению.

3.1.2. СРЕДСТВА ПЕРЕСЫЛКИ ФАЙЛОВ

Первая группа средств - это простые универсальные переносчики фай-
лов. Программа cptdir может копировать каталог (и любые подчиненные ка-
талоги, лежащие ниже в дереве) в каталог-приемник. Каталог-приемник -
это обычно каталог, назначенный в качестве резервной копии для некото-
рого проекта.
Программа can берет на себя необходимую рутинную работу - убирает
"мусор". Эта программа позволяет вам выбрать типы временных файлов, ко-
торые должны периодически удаляться. Направляя их в "мусорный" каталог,
can предоставляет вам возможность просмотреть все, что было удалено, и
восстановить то, что вы на самом деле хотите сохранить.
Программа dosflp допускает применение символов-шаблонов в именах
файлов, используемых при копировании отобранных файлов с дискет формата
MS-DOS в XENIX. Это упрощает операцию копирования и уменьшает число на-
жатий на клавиши.

3.1.3. СРЕДСТВА КОПИРОВАНИЯ

Далее представляется "рабочая лошадка" - средства копирования.
Autobkp использует список маршрутных имен, чтобы определить, какие
части файловой системы должны быть проверены. Затем эта программа копи-
рует из выбранных областей те файлы, которые были добавлены или измене-
ны в последние 24 часа.
Cpiobr предоставляет интерактивное дополнение к команде cpio
системы UNIX. Она позволяет вам скопировать файлы с жесткого диска на
гибкий и, если необходимо, восстановить их с гибкого диска на жесткий.

3.1.4. СРЕДСТВА ПРОВЕРКИ ОПЕРАЦИЙ КОПИРОВАНИЯ

Выполнение копирования не избавит вас от волнений, пока вы не бу-
дете знать, что вы скопировали все, что хотели, и что копирование прош-
ло корректно. Программа dsum использует контрольную сумму для проверки
того, что исходный каталог и каталог-копия содержат одни и те же файлы.
Программа log отображает регистрационный файл, чтобы показать, какое
автоматическое копирование выполнялось в четыре часа утра, когда вы
(надеемся) спали.
При создании этих средств мы просмотрим некоторые важные команды
системы UNIX и обнаружим новые способы их использования. Когда вы про-
работаете всю данную главу, вы будете знать, как работать "с мельчайши-
ми частицами" при использовании файловой системы UNIX. Вы сможете авто-
матизировать иную большую область ваших компьютерных будней. Вы должны
суметь создать пользовательские утилиты копирования и верификации,
удовлетворяющие вашим нуждам. Вы сможете перевести вашу систему в режим
работы, обеспечивающий ей самостоятельное выживание. (Мы оставляем фи-
лософам определять, даст ли это вашему компьютеру примитивную форму
жизни!)
Между прочим, многие средства в данной главе пользуются преиму-
ществами рекурсивных методов обхода дерева, которые мы разработали в
предыдущей главе. Вы можете просмотреть тот материал, если у вас име-
ются затруднения в понимании того, что представлено здесь.


3.2. ПЕРЕСЫЛКА ФАЙЛОВ

3.2.1. cptdir - копирование дерева каталога

ИМЯ: cptdir
cptdir Копирует дерево каталога в другое место

ФУНКЦИЯ
Копирует дерево файловой системы, корень которого расположен в ка-
талоге, в другой каталог системы. Нет ограничений на какой-либо специ-
фический каталог или жесткий диск.
ФОРМАТ
cptdir [-s] каталог-источник каталог-приемник
ПРИМЕР ВЫЗОВА
cptdir $HOME /bkp
Копирует каждый файл из $HOME в каталог /bkp.

КОМАНДНЫЙ ФАЙЛ cptdir

1 :
2 # &(#) cptdir v.1.0 Copy a directory tree Autor: Russ Sage

4 if [ $# -lt 2 -o $# -gt 3 ]
5 then echo "cptdir: argument error" "&2
6 echo "usage: cptdir [-s] srcdir desdir" "&2
7 echo " -s silent mode" "&2
8 exit 1
9 fi

11 if [ "$1" ="-s" ]
12 then OPT="-pd"
13 shift
14 else OPT="-pdv"
15 fi

17 SRC=$1
18 DEST=$2
19 umask 0

21 if [ -d $DEST ]
22 then echo "\"$DEST\" already exist. Remove it? (y/n): \c"
23 read CMD
24 if [ "$CMD" = "y" ]
25 then rm -rf $DEST
26 mkdir $DEST
27 fi
28 else mkdir $DEST
29 fi

31 if [ "`echo $DEST|cut -c1`" = "/" ]
32 then cd $SRC
33 find . -print | sort | cpio $OPT $DEST
34 else PWD=`pwd`
35 cd $SRC
36 find . -print | sort | cpio $OPT $PWD/$DEST
37 fi

ПЕРЕМЕННЫЕ СРЕДЫ

CMD Команда, полученная от пользователя
DEST Каталог-приемник, в который нужно копировать
OPT Опции, которые передаются утилите cpio
PWD Текущий рабочий каталог
SRC Каталог-источник, из которого нужно копировать

Описание
Зачем нам нужен cptdir?

Мы уже отмечали необходимость в дополнительных командах, которые
рекурсивно обходят древовидную структуру файловой системы UNIX. В ран-
них версиях UNIX единственная команда tar могла управлять движением по
дереву. В более новых версиях системы имеется опция -r в команде cp,
которая делает cp рекурсивной (эта возможность реализована только в
последней версии System V) и команда cpio. Последняя является многоце-
левой командой копирования, которая может иметь дело как с потоковым
форматом, так и с форматом файловой системы.

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

Список сторінок

Поділитися у соцмережах

☏ Замовлення реклами: +3805044-68-872

© Асоціація електронних бібліотек України

☝ Усі матеріали сайту (зокрема статті, зображення, рекламні оголошення тощо) призначені лише для попереднього ознайомлення. Усі права на публікації, представлені на сайті, належать їхнім законним власникам. Просимо Вас не зберігати копії інформації.