Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#15| Dragon God
Demon's Souls |#14| Flamelurker
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Сэйдж Рас Весь текст 822.4 Kb

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

Предыдущая страница Следующая страница
1 ... 12 13 14 15 16 17 18  19 20 21 22 23 24 25 ... 71
       ("silent"  -  молчаливый).  По  умолчанию  используется режим "verbose"
       (многословный), который отображает имена по мере копирования файлов.
            Заметьте, что это копирование, а не перемещение файлов. Недостаток
       копирования в отличие от перемещения заключается в том, что если прием-
       ником является каталог на том же диске, то вам требуется дополнительное
       место на диске для размещения  второго  образа.  Вам  также  необходимо
       иметь  достаточно описателей файлов (inodes) для сохранения всех файлов.
       В противном случае вы можете лишиться шанса сбросить в "мусорную корзи-
       ну" ваши рабочие файлы.
            В командной строке допустимо указание каталога-источника и имя ка-
       талога-приемника.  Единственный  ключ,  допустимый в командной строке -
       это "-s".  Любой другой ключ приводит к завершению команды,  не вызывая
       никаких  разрушений.  Вы,  конечно,  можете  добавить программный код с
       целью проверки опции и выдачи сообщения о допустимых ключах,  если ука-
       зано  нечто отличное от -s.  Если вы делаете еще какую-либо проверку на
       наличие ошибок сверх того,  что требуется для предотвращения разрушения
       данных или системы,  то это дело личного вкуса. Минимизация проверок на
       наличие ошибок дает более компактные и быстрые сценарии, подходящие для
       опытных пользователей.
            Если указанный каталог-приемник не существует,  то  он  создается.
       Если каталог-приемник уже существует,  выдается сообщение об этом и вам
       задается вопрос о том,  хотите ли вы очистить  его.  Если  вы  ответите
       "yes",  каталог уничтожается и создается снова пустым. Если вы ответите
       "no",  каталог остается таким, какой есть и копируемые файлы просто до-
       бавляются к уже существующим в наличии. При этом может возникнуть неко-
       торая путаница,  особенно если некоторые файлы с такими именами уже су-
       ществуют в каталоге-приемнике. В большинстве случаев, однако, у пользо-
       вателей не появляется желания добавлять свою копию в существующий ката-
       лог.
            Тем не менее каталог-приемник должен быть создан,  поскольку необ-
       ходимо его  наличие,  чтобы команда cpio работала правильно. Если же его
       нет, cpio не выполнится и выдаст сообщение об ошибке.
            Процедура cptdir начинает копирование путем прохождения по катало-
       гу-источнику и формирования списка файлов, находящихся в нем, рекурсив-
       но обходя дерево сверху вниз. В результате может получиться, что скопи-
       руется больше,  чем вы планировали, поэтому вам необходимо знать размер
       файловой структуры,  которую вы хотите скопировать. Затем файлы копиру-
       ются в каталог-приемник.  Исходные файлы никак не модифицируются  и  не
       изменяются (за исключением того, что дата последнего доступа может быть
       модифицирована).
            Когда идет копирование, на экран выдается сообщение от cpio, кото-
       рое показывает полный маршрут к файлам-приемникам.  Этот маршрут должен
       соответствовать  маршруту,  указанному в командной строке,  в противном
       случае что-то не так.

            Примеры
        1. $ cd /mnt
           $ cptdir /bin .
            Перейти на  другой  диск (обычно смонтированный в каталоге /mnt) и
       копировать все файлы из каталога /bin в текущий каталог.  Обратите вни-
       мание, что результирующими файлами будут /mnt/*, что может не совпадать
       с вашим желанием.
        2. $ cd /bin
           $ cptdir . /mnt/bin
            То же, что и в предыдущей команде, но обратите внимание, что точка
       изменила свою позицию.  Команда указывает копирование всех файлов теку-
       щего каталога в каталог /mnt/bin. Получаются файлы /mnt/bin/*, что выг-
       лядит более резонным.
        3. $ cptdir /bin /mnt
        То же, что и в примере 1.
        4. $ cptdir /bin /mnt/bin
        То же, что и в примере 2.

            Пояснения

            В строках 4-9 производится проверка аргументов  командной  строки.
       Если  указано меньше двух аргументов,  этого недостаточно.  Как минимум
       должны быть указаны имена каталога-источника и каталога-приемника.  Бо-
       лее трех аргументов слишком много. Самое большее, там должны быть опция
       -s, каталог-источник и каталог-приемник.
            В строках  11-15 устанавливаются ключи команды cpio.  По умолчанию
       это pdv,  что означает "pass" (передача) для копирования в формате фай-
       ловой системы (в отличие от необработанного потока данных), "directory"
       (каталог) для создания каталога при  необходимости  и  "verbose"  (мно-
       гословный)  для выдачи имен файлов по мере их копирования.  Если первым
       позиционным параметром  является  ключ  -s,  который  указывает  запуск
       cptdir в молчаливом режиме, ключи команды cpio не содержат ключа выдачи
       сообщений и, таким образом имена файлов не выдаются на экран.
            Строки 17,18 и 19 устанавливают каталоги "откуда" и "куда" и уста-
       навливают переменную umask в 0.  Переменная umask определяет подразуме-
       ваемые  права  доступа для всех файлов,  созданных нашим командным про-
       цессором. Мы изменяем umask для гарантии того, что все файлы копируются
       в  дерево-приемник  и  ни  один  из  них  не  будет  заблокирован из-за
       отсутствия прав чтения или записи.  Побочным эффектом является то,  что
       все  каталоги  имеют  права доступа вида rwxrwxrwx,  а все файлы - вида
       rw-rw-rw-,  что может потребовать изменений для обеспечения вашей безо-
       пасности.  Изменение umask имеет действие только на время работы проце-
       дуры.  Когда cptdir завершается,  umask вашего  вызывающего  командного
       процессора остается неизменным.
            Строки 21-29 выполняют проверку каталога-приемника.  Если  он  уже
       существует,  вас  запрашивают,  нужно  ли его удалить и заново создать.
       Если он не существует, он создается для работы cpio.
            Строки 31-36  выполняют  непосредственно  копирование.  Прежде чем
       объяснить,  что здесь делается,  давайте сперва посмотрим, как работает
       cpio.  Поскольку оператор find генерирует список файлов, нам необходимо
       представлять, как его выход может влиять на выполнение cpio.
            Если мы  указали  "find  .  -print",  то полные имена файлов будут
       иметь точку впереди, например:
            ./dir
            ./dir/file1
            ./dir/file2
            Это относительная нотация,  которая очень полезна, когда вы не хо-
       тите, чтобы ваши файлы передавались согласно абсолютным маршрутным име-
       нам,  но хотим сохранить их взаимосвязь друг с другом. Если на них ссы-
       латься  относительно точки,  то место,  куда они будут помещены,  может
       быть, где угодно. Однако, если мы скажем "find /dir -print", список бу-
       дет выглядеть так:
            /dir
            /dir/file1
            /dir/file2
            В обоих случаях мы ссылаемся на наш текущий каталог, но применение
       записи вида /dir заставляет полное имя начинаться с "/" и не  допускает
       использование  относительной нотации.  Передача такой же информации ко-
       манде cpio может радикально изменить  место  размещения  ваших  файлов.
       Например, если я сказал "cd /src; find . -print | cpio -pdv /dest", ре-
       зультирующий список будет таким:
            /dest/./dir
            /dest/./dir/file1
            /dest/./dir/file2
            где на первом месте стоит,  вероятно,  то,  что вы хотели. Однако,
       если  я  сказал  "find  /src -print | cpio -pdv /dest",  результирующие
       маршрутные имена будут такими:
        /dest/src/dir
        /dest/src/dir/file1
        /dest/src/dir/file2
            что не очень хорошо, поскольку это создает уровень каталога, в ко-
       тором нет необходимости. Заметьте, что имя каталога "src" было перехва-
       чено при распечатке.  Это произошло потому,  что его выдал find, а cpio
       считает, что src было частью имени каталога-приемника.
            Повсеместное использование относительной  нотации  может  привести
       нас к потере уже имеющейся информации.  Например,  если бы я сказал "cd
       /nowhere; find /src ....", каталог-приемник получил бы неверное имя. Мы
       должны уметь использовать этот тип нотации и не попадать в ловушки син-
       таксиса. Это и есть то, что делает cptdir.
            В строке 31 производится проверка на то, является ли первый символ
       в маршрутном имени целевого каталога символом "косая черта" ("/"). Если
       да, то мы точно знаем, что имя каталога-приемника выражено в виде абсо-
       лютного маршрутного имени, поэтому мы можем сменить каталоги без потери
       информации о нашем текущем каталоге. В строках 32-33 мы переходим в ка-
       талог-источник и копируем файлы.
            Но если  первый  символ  каталога-приемника  НЕ является наклонной
       чертой,  используемая нотация является относительной.  Это значит,  что
       если  мы сменим каталог,  мы потеряем информацию о том,  где мы находи-
       лись,  когда был запущен командный файл. Чтобы избежать этого, мы полу-
       чаем  в  строке  34 полное имя текущего каталога путем перехвата вывода
       команды pwd и присвоения этого значения переменной таким  образом,  что
       позже мы сможем ее восстановить.  Затем мы переходим в каталог-источник
       и копируем файлы,  используя префикс абсолютного маршрутного  имени  от
       команды pwd и относительный суффикс того места, где мы находимся.
            Причиной того,  что мы так поступаем,  является использование  от-
       носительной (точечной) нотации в операторе find.  Как можно было видеть
       в предыдущем описании,  отказ от использования точечной  нотации  может
       привести  к  путанице в маршрутных именах каталога-приемника.  Для того
       чтобы всегда использовать точку в операторе find,  нам необходимо  убе-
       диться,  куда мы собираемся пересылать файлы. Еще раз напомним, что ко-
       манда cd действует только для данного командного  процессора  "низкого"
       уровня,  поэтому она не влияет на тот командный процессор,  который за-
       пустил командный файл. Вообще, командный файл должен оставить пользова-
       телей  в тех же условиях,  в которых они находились перед его запуском,
       за исключением выполнения необходимых работ,  при которых  не  произво-
       дится смена текущего каталога.
            Когда cptdir завершается,  управление возвращается вызывающему ко-
       мандному процессору, который по-прежнему ведет свой собственный текущий
       каталог. Напомним, что всегда, когда вы переходите на более низкий уро-
       вень командного процессора,  экспортируемые переменные передаются вниз,
       но НИЧЕГО не передается наверх.

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

            В нынешней реализации никакие дополнительные ключи не  допускается
       передача никаких дополнительных ключей команде cpio. Что случится, если
       вы захотели заменить копирование файлов,  где это  возможно,  созданием
       ссылок  (ключ  -l)  или  не менять время последнего доступа к исходному
       файлу при его копировании (опция -a)?  Такие возможности были бы  недо-
       пустимы.
            Можно легко добавить возможность передачи дополнительных  аргумен-
       тов.  Они должны быть опознаны как аргументы, сохранены и затем выбраны
       из командной строки.
            Для этого потребуется такой цикл:
        for ARG in $*
        do
                if [ "`echo $ARG|cut -c1`" = "-" ]
                  then  CPIOARG="CPIOARG $ARG"
                        shift
                fi
        done
            Затем переменная CPIOARG может быть передана команде cpio.
Предыдущая страница Следующая страница
1 ... 12 13 14 15 16 17 18  19 20 21 22 23 24 25 ... 71
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (52)

Реклама