Книга посвящена дистрибутиву Linux Mint и одной из его главных



Скачать 21.34 Mb.
Pdf просмотр
страница12/30
Дата22.11.2016
Размер21.34 Mb.
Просмотров6010
Скачиваний0
1   ...   8   9   10   11   12   13   14   15   ...   30
… и компрессия
Утилита gzip — это традиционный компрессор систем, сменивший всей роли более старую утилиту compress. Простейший способе использования таков gzip filename где в качестве аргументов будет выступать имя файла. При этом
(внимание!) исходный несжатый файл подменяется своей сжатой копией,
которой автоматически присваивается расширение В качестве аргументов может выступать и произвольное количество имен файлов — каждый из них будет заменен сжатым файлом *.gz. Более того,
посредством опции -r может быть выполнено рекурсивное сжатие файлов во всех вложенных подкаталогах. Подчеркну, однако, что никакой архивации команда gzip не производит, обрабатывая зараз только единичный файл.
Фактически форма gzip file1 file2 ... file# просто эквивалент последовательности команд gzip file1
$ gzip file2
$ gzip file# Правда, объединение компрессированных файлов возможно методом конкатенации (с помощью команды cat) или посредством архивирования командой tar.
Команда gzip имеет и другие опции, указываемые в краткой
(однобуквенной) или полной нотации. В отличие от tar, знак дефиса (или,
соответственно, двойного дефиса) обязателен в обоих случаях. Так, опциями … -9 можно задать степень сжатия и, соответственно, время исполнения процедуры -1 соответствует минимальному, но быстрому сжатию, -9 - максимальному, но медленному. По умолчанию в команде gzip используется опция -6, обеспечивающая разумный компромисс между скоростью и компрессией.
Благодаря опции -d (--decompress) команда gzip может выполнить развертывание сжатого файла, заменяя его оригиналом без расширения Хотя в принципе для этого предназначена команда gunzip:
$ gunzip file.gz Использование этой команды настолько прозрачно, что я задерживаться на ней не буду. Замечу только, что утилита gzip интегрирована в архиватор tar,
вызвываясь из него опцией z. То есть для создания компрессированного архива потребуется такая команда tar czf archive.tar.gz path2/ А для декомпрессии и развёртывания архива — такая tar xzf archive.tar.gz В обоих случаях не принесёт вреда добавление опции v — она обеспечит вывод на экран сообщеня о ходе процесса.
В относительно недавнее время некоторое распространение получил компрессор bzip2, обеспечивающий большую (на 10-15%) степень сжатия,
хотя и менее быстродействующий. Использование его практически идентично gzip, с деталями его можно ознакомиться с помощью страницы экранной документации man Итоговый компрессированный файл получает имя вида *.bz2 и может быть распакован командой bunzip2 (или командой bzip2 -d). Следует только помнить, что форматы *.gz и *.bz2 несовместимы между собой.
Соответственно, первый не может быть распакован программой bunzip2, и наоборот.
Как и gzip, утилита bzip2 может быть вызвана из архиватора tar — при создании компрессированного архива так tar cjf archive.tar.bz2 path2/ А при развёртывании оного — эдак tar xjf archive.tar.bz2 Особо задерживаться на этой утилите не хочется ещё и потому, что, мне кажется, вскоре она выйдет из употребеления. Ибо, обеспечивая меньшую степень сжатия по сравнению с форматом xz (о котором сейчас будет речь отнюдь не превосходит его по скорости компрессии и декомпрессии. И
там, где критично именно время упаковки (а также универсальность, будет по прежнему использоваться старый добрый gzip. Там же, где на первый план
выходит степень сжатия, карты в руки новому формату xz. Который, кстати,
на мощных машинах по скорости создания и распаковки вплотную приближается к Реализацией формата xz является набор утилит XZ Utils, основанный на алгоритме LZMA (Lempel-Ziv-Markov chain-Algorithm). Сам по себе метод сжатия LZMA существует достаточно давно он был разработан нашим соотечественником Игорем Павловым с использованием достижений предшественников, разработавших алгоритмы LZ77, LZ78 и LZV — что,
впрочем, могло бы составить предмет отдельной истории, которую когда- нибудь кто-нибудь напишет.
А метод LZMA был задействован его автором в собственной же разработке утилите компрессии 7-Zip для Windows, быстро снискавшей славу несравненного «сжимателя» файлов. Инструментарий для разработки программ, использующих данный метод (LZMA SDK) распространялся сначала на условиях лицензии GPL, что позволяло использовать его в соответствующих проектах (например, в GNU tar). Однако в конце 2008 года
Игорь Павлов превратил его в общественное достояние (Public Domain). Вслед зачем был создан основанный на этом методе пакет LZMA Utils, немедленно встроенный в tar. Что сделало этот метод компрессии столь же простыми обыденным, как gzip или bzip2. И с тех пор эта возможность, после установки соответствующего пакета, присутствует во всех дистрибутивах Правда, вслед затем появился LZMA2, улучшенная версия того же алгоритма, обеспечивающий более высокую степень сжатия и лучшую поддержку многопоточности. А на его основе был создан пакет XZ Utils именно он в настоящее время используется в Mint по умолчанию. И включает в себя такие команды — компрессор и, при указании опции --decompress, декомпрессор — собственно декомпрессор осуществляет декомпрессию на стандартный выводи ы для lzma-компрессированных текстовых файлов, xzegrep, xzfgrep — поиск текстовых фрагментов в xz- компрессированных файлах.
Последние три утилиты работают аналогично командам xzgrep, xzegrep,
xzfgrep, применённым к некомпрессированным файлам. А команда xzcat является аналогом утилиты cat. Об этих четырёх командах будет подробно говориться в ближайших разделах.
Утилиты пакета XZ Utils могут, с некоторыми ограничениями, работать с файлами, запакованными старым методом LZMA1 (ноне наоборот. Хотя сами по себе пакеты XZ Utils и LZMA Utils между собой конфликтуют.
Разумеется, поддержка XZ была немедленно встроена ив. Так что теперь для применения компрессии LZMA2 при создании архива достаточно указать соответствующую опцию tar --create --xz --file filename.tar.xz path2/arch_dir
Или, в более употребимой простыми людьми краткой форме, так tar cJf filename.tar.lzma path2/arch_dir где опция J и представляет собой алиас для полной формы -xz. Если присваивать архивному файлу суффикс по правилам утилиты tar, опцию можно заменить на a (что эквивалентно полной форме -обеспечивающей определение типа компрессии по расширению *.xz. Более того, скажу по секрету если архив именован по правилам, то можно опустить даже опцию --auto-compress — она итак будет задействована по умолчанию.
Распаковка xz-компрессированного архива выполняется в обратном порядке tar xJf filename.tar.xz или tar xaf Метод LZMA и особенно LZMA2 вследствие эффективности компрессии быстро нашёл себе применение в сборке дистрибутивных пакетов именно сего помощью в настоящее время сжимаются пакеты Mint (и всех других дистрибутивов, использующих этот формат пакетов).
Утилита find и xargs при ней
На этих страницах речь пойдет о пакете, известном в проекте GNU как findutils. Ив первую голову — о команде find (как, впрочем, и о тесно связанной с ней команде xargs). Столь высокая честь выпадает им потому, что посредством этих двух команд можно выполнить если не все, то изрядную задач, возникающих при работе с файлами.
Итак, апофеоз командного файлового менеджмента — утилита find. Строго говоря, вопреки своему имени, команда эта выполняет не поиск файлов как таковой, но — рекурсивный обход дерева каталогов, начиная с заданного в качестве аргумента, отбирает из них файлы в соответствие с некоторыми критериями и выполняет над отбракованным файловым хозяйством некоторые действия. Именно эту ее особенность подчеркивает резюме команды find, получаемое (в некоторых системах) посредством whatis find find(1) — walk a file hierarchy что применительно случаю можно перевести как прогулка по файловой системе».
Команда find по своему синтаксису существенно отличается от большинства прочих команд. В обобщенном виде формат ее можно представить следующим образом find аргумент [опция_поиска] значение [опция_действия] В качестве аргумента здесь задается путь поиска, то есть каталог, начиная с которого следует совершать обход файловой системы, например, корень ее:

$ find / [опция_поиска] значение
[опция_действия] или домашний каталог пользователя find
/ [опция_поиска] значение
[опция_действия] Опция поиска — критерий, по которому следует отбирать файл (файлы) из определенных в аргументе частей файловой системы. В качестве таковых могут выступать имя файла (-name), его тип (-type), атрибуты принадлежности, доступа или времени.
Ну а опция действия определяет, что же надлежит сделать с отобранными файлом или файлами. А сделать сними, надо заметить, можно немало начиная с вывода на экран (-print, опция действия по умолчанию) и кончая передачей в качестве аргументов любой другой команде (Как можно видеть из примера, опция поиска и опция действия предваряются знаком дефиса, значение первой отделяется от ее имени пробелом.
Однако начнём по порядку. Опции поиска команды find позволяют выполнить отбор файлов последующим критериям (символ дефиса перед опциями ниже опущен, ноне следует забывать его ставить — поиск по имени файла или по маске имени в последнем случае метасимволы маски должны обязательно экранироваться
(например, — name \*.tar.gz) или заключаться в кавычки (одинарные или двойные, в зависимости от ситуации этот критерий чувствителен к регистру, но близкий по смыслу критерий iname позволяет производить поиск по имени без различения строчных и заглавных букв

type — поиск по типу файла этот критерий принимает следующие значения f (регулярный файл, d (каталог, s (символическая ссылка, файл блочного устройства, c (файл символьного устройства

user и group — поиск по имени или идентификатору владельца или группы, выступающим в качестве значения критерия существует также критерии nouser и nogroup — они отыскивают файлы, владельцев и групповой принадлежности не имеющие (то есть тех, учетные записи для которых отсутствую в файлах /etc/passwd и /etc/group); последние два критерия в значениях, разумеется, не нуждаются

size — поиск по размеру, задаваемому в виде числа в блоках или в байтах — в виде числа с последующим символом c; возможны значения равно n блоков, +n (более n блоков, -n (менее n блоков

perm — поиск файлов по значениям их атрибутов доступа, задаваемых в символьной форме

atime, ctime, mtime — поиск файлов с указанными временными атрибутами значения временных атрибутов указываются в сутках
точнее, в периодах, кратных 24 часам возможны формы значений этих атрибутов n (равно указанному значению n*24 часа, +n (ранее часа, -n (позднее n*24 часа

newer — поиск файлов, измененных после файла, указанного в качестве значения критерия (то есть имеющего меньшее значение mtime);

maxdepth и mindepth позволяют конкретизировать глубину поиска во вложенных подкаталогах — меньшую или равную численному значению для первого критерия и большую или равную — для второго

depth — производит отбор в обратном порядке, то есть не от каталога,
указанного в качестве аргумента, ас наиболее глубоко вложенных подкаталогов смысл этого действия — получить доступ к файлам в каталоге,
для которого пользователь не имеет права чтения и исполнения

prune — позволяет указать подкаталоги внутри пути поискав которых отбора файлов производить не следует. Кроме этого, существует ещё одна опция поиска — fstype, предписывающая выполнять поиск только в файловой системе указанного типа очевидно, что она может сочетаться с любыми другими опциями поиска. Например, команда find / -fstype ext3 -name zsh* будет искать файлы, имеющие отношение к оболочке Z-Shell, начиная с корня, но только — в пределах тех разделов, на которых размещёна файловая система Ext3fs (на моей машине — это именно чистый корень, за вычетом каталогов /usr, /opt, /var, /tmp и, конечно же, Критерии отбора файлов могут группироваться практически любым образом. Так, в форме find
/ -name *.tar.gz newer filename она выберет в домашнем каталоге пользователя все компрессированные архивы, созданные после файла с именем filename. По умолчанию между критериями отбора предполагается наличие логического оператора логическое И. То есть будут отыскиваться файлы, удовлетворяющие и маске имении соответствующему атрибуту времени. Если требуется использование оператора OR (логическое ИЛИ, он должен быть явно определен в виде дополнительной опции -o между опциями поиска. Так,
команда:
$ find
/ -mtime -2 -o newer filename призвана отобрать файлы, созданные менее двух суток назад, или же позднее, чем файл Особенность реализации команды find (как, впрочем, и ее тезки из числа утилит) — то, что она по умолчанию выводит список отобранных в соответствии с заданными критериями файлов на экран, не требуя дополнительных опций действия. Однако, как говорят, в других Unix-системах
помнится, даже ив некоторых реализациях Linux мне такое встречалось)
указание какой-либо из таких опций — обязательно. Так что рассмотрим их по порядку.
Для выведения списка отобранных файлов на экран в общем случае предназначена опция -print. Вывод этот имеет примерно следующий вид find . -name f* -print
./file1
./file2
./dir1/file3 Сходный смысл имеет и опция -ls, однако она выводит более полные сведения о найденных файлах, аналогично команде ls с опциями -dgils:
$ find / -fstype ext3 -name zsh -ls
88161 511 -rwxr-xr-x 1 root root 519320 Ноя 23 15:50 /bin/zsh Важное, как мне кажется, замечание. Если команда указанного вида будет дана от лица обычного пользователя (не оператора, кроме приведенной выше строки вывода, последуют многочисленные сообщения вроде find: /root: Permission denied указывающие на каталоги, закрытые для просмотра обычным пользователем, и весьма мешающие восприятию результатов поиска. Чтобы подавить их, следует перенаправить вывод сообщения об ошибках в файл, то есть указать им Дорогу никуда find / -fstype ext3 -name zsh -ls 2> /dev/null Идем далее. Опция -delete уничтожит все файлы, отобранные по указанным критериям. Так, командой find
-atime +100 -delete будут автоматически стерты все файлы, к которым не было обращения за последние 100 дней (из молчаливого предположения, что раз к ним три месяца не обращались — значит, они и вообще ненужны. Истреблению подвергнутся файлы в подкаталогах любого уровня вложенности — ноне включающие их подкаталоги (если, конечно, последние сами не подпадают под критерии отбора).
И, наконец, опция -exec — именно ею обусловлено величие утилиты find. В
качестве значения ее можно указать любую команду с необходимыми опциями — иона будет выполнена над отобранными файлами, которые будут рассматриваться в качестве ее аргументов. Проиллюстрируем это на примере.
Использовать для удаления файлов опцию -delete, как мы это только что сделали — не самое здоровое решение, ибо файлы при этом удаляются без запроса, и можно случайно удалить что-нибудь нужное. И потому достигнем той же цели следующим образом:

$ find
/ -atime +100 -exec rm -i {} ; В этом случае (вне зависимости от настроек псевдонимов командной оболочки) на удаление каждого отобранного файла будет запрашиваться подтверждение.
Обращаю внимание на последовательность символов {} \; (с пробелом между закрывающей фигурной скобкой и обратным слэшем) в конце строки.
Пара фигурных скобок {} символизирует, что свои аргументы исполняемая команда (в примере — rm) получает от результатов отбора команды точка с запятой означает завершение команды-значения опции -exec, а обратный слэш экранирует ее специальное значение от интерпретации командной оболочкой.
Кроме опции действия -exec, у команды find есть ещё одна, близкая по смыслу, опция — -ok. Она также вызывает некую произвольную команду,
которой в качестве аргументов передаются имена файлов, отобранные по критериям, заданным опцией (опциями) поиска. Однако перед выполнением каждой операции над каждым файлом запрашивается подтверждение.
Приведенный на предыдущей странице пример, хотя и вполне жизненный,
достаточно элементарен. Рассмотрим более сложный случай — собирание в один каталог всех скриншотов в формате PNG, разбросанных по древу домашнего каталога find
/ -name *.png -exec cp {} imagesdir ; В результате все файлы будут изысканы и скопированы (или —
перемещёны, если воспользоваться командой mv вместо cp) водно место.
А теперь — вариант решения задачи, которая казалась мне некогда трудноразрешимой рекурсивное присвоение необходимых атрибутов доступа в разветвленном дереве каталогов — различных для регулярных файлов и каталогов.
Зачем и отчего это нужно Поясню на примере. Как-то раз, обзаведясь огромным по тем временам (40 Гбайт) винчестером, я решил собрать на него все нужные мне данные, рассеянные по дискам CD-R/RW (суммарным объёмом с полкубометра) и нескольким сменным винчестерам, одни из которых были отформатированы в FAT16, другие — в FAT32, третьи — вообще в ext2fs (к слову сказать, рабочей моей системой в тот момент была FreeBSD). Сгрузив все это богачество в один каталог на новом диске, я создал в нем весьма неприглядную картину.
Ну, во-первых, все файлы, скопированные си дисков, получили
(исключительно из-за неаккуратности монтирования, с помощью должных опций этого можно было бы избежать, но — спешка, спешка) биты исполняемости, хотя были это лишь файлы данных. Казалось бы, мелочь, но иногда очень мешающая в некоторых случаях это не позволяет, например,
просмотреть файл в Midnight Commander простым нажатием Enter. Во- вторых, для некоторых каталогов, напротив, исполнение не было предусмотрено ни для кого — то есть я же сам перейти в них не мог. В
третьих, каталоги (и файлы) с CD часто не имели атрибута изменения — а они нужны мне были для работы (в т.ч. и редактирования. Конечно, от всех этих артефактов можно было бы избавиться, предусмотрев должные опции монтирования накопителей (каждого накопителя — а их число, повторяю,
измерялось уже объёмом занимаемого пространства, да я об этом и не подумал — что выросло, то выросло. Так что ситуация явно требовала исправления, однако проделать вручную такую работу над данными более чем в 20 Гбайт виделось немыслимым.
Да так оно, собственно, и было бы, если б не опция -exec утилиты Каковая позволила изменить права доступа требуемым образом. Итак,
сначала отбираем все регулярные файлы и снимаем с них бит исполнения для всех, заодно присваивая атрибут изменения для себя, любимого find
/dir_data -type f
-exec chmod a-x,u+w {} ; Далее — поиск каталогов и обратная процедура над итоговой выборкой find
/dir_data -type d
-exec chmod a+xr,u+w {} ; И дело — в шляпе, все права доступа стали единообразными (и теми, что мне нужны. Именно после этого случая я, подобно митьковскому Максиму,
проникся величием философии марксизма (пардон, утилиты find). А ведь это ещё не предел ее возможностей — последний устанавливается только встающими задачами и собственной фантазией...
Так, с помощью команды find легко наладить периодическое архивирование результатов текущей работы. Для этого перво-наперво создаем командой tar полный архив результатов своей жизнедеятельности tar cvf alldata.tar
/* А затем в меру своей испорченности (или, напротив, аккуратности, время от времени запускаем команду find
/ -newer alldata.tar
-exec tar uvf alldata.tar {} ; ещё один практически полезный вариант использования команды find в мирных целях — периодическое добавление отдельно написанных фрагментов к итоговому труду жизни (например, собственным мемуарам).
Впрочем, чтобы сделать это, необходимо сначала ознакомиться с командами обработки файлов, к которым мы вскоре обратимся.
А пока — об ограничении возможностей столь замечательной сцепки команды find с опцией действия -exec (распространяющиеся и на опцию -Оно достаточно очевидно вызываемая любой из этих опций команда выполняется в рамках самостоятельного процесса, что на слабых машинах,
как говорят, приводит к падению производительности (должен заметить, что на машинах современных заметить этого практически невозможно).
Тем не менее, ситуация вполне разрешима. И сделать это призвана команда xargs. Она определяется как построитель и исполнитель командной строки со стандартного ввода. А поскольку на стандартный ввод может быть направлен вывод команды find — xargs воспримет результаты ее работы как аргументы
какой-либо команды, которую, в свою очередь, можно рассматривать как аргумент ее самоё (по умолчанию такой командой-аргументом является
/bin/echo).
Использование команды xargs не связано с созданием изобилия процессов
(дополнительный процесс создается только для нее самой. Однако она имеет другое ограничение — лимит на максимальную длину командной строки. Во всех системах, которые мне довелось видеть, этот лимит составляет, что определяется командой следующего вида sysctl -a | grep kern.argmax И способы изменить этот лимит мне неизвестны был бы благодарен за соответствующую информацию.
Команды обработки текстов введение
Только что речь шла о командах, которые манипулируют файлами как целыми, не затрагивая их содержания (ив общем случае, от такового независящих. Ныне же речь пойдет о командах, создающих и изменяющих внутреннее содержание файлов, правда, только текстовых.
Конечно, само по себе манипулирование файлами (копирование,
перемещёние и т.д.) также подразумевает изменение содержания некоторых файлов, но только одного-единственного типа (а именно - каталогов, однако собственно внутренняя сущность обычных файлов при этом не изменяется.
Предметом же настоящей интермедии будут штатные средства POSIX-систем,
позволяющие в той или иной мере учитывать контент файлов и манипулировать им. Разумеется, манипулирование контентом возможно только для регулярных файлов. При этом многие их разновидности (бинарные файлы, файлы графических форматов и процессоров) требуют для изменения своего содержания специальных средства именно, компиляторов и прикладных программ, в которых они создавались. Однако здесь о них разговора не будет - ибо целью моей было продемонстрировать мощь обычных команд для решения многих пользовательских задач. Правда, на самом деле команды модификации контента действенны преимущественно для файлов текстовых.
Однако круг объектов таких команд не столь уж узок, как может показаться. Ведь именно в виде обычных текстовых файлов в ОС POSIX- семейства хранится масса общесистемной информации, исполняемых сценариев, баз данных атрибутов самых разных объектов. Далее - собственно нарративные тексты любого содержания ведь чисто текстовый формат для них куда роднее, чем всякого рода *.doc и *rtf. Ну и никем не возбраняется использовать такие команды в отношении текстов с разметкой - HTML ли, XML,
TeX или ещё чего. Так что поле приложения рассматриваемых команд - достаточно обширно.
Просмотр файлов
Однако прежде чем как-то манипулировать контентом файлов, желательно этот самый контент некоторым образом просмотреть. И тут можно вспомнить о команде cat, посредством которой мы некогда создавали файлы. Данная с именем файла в качестве аргумента, она выведет его содержимое на экран.
Можно использовать и конструкцию перенаправления:

$ cat < filename
Не смотря на то, что в принципе это разные вещи, результат будет тот же - вывод содержимого файла на экран.
Недостаток команды cat как средства просмотра - невозможность перемещёния по телу файла: выведя содержимое, она завершает свою работу. Конечно,
«пролистывание» выведенного возможно, но - средствами системной консоли,
а не самой команды.
Поэтому обычно для просмотра содержимого файлов используются специальные программы постраничного просмотра - т.н. pager'ы, очередной пример того, что передача этого термина исконно русским словом «пейджер»
(а мне попадалось и такое) может создать совершенно превратное представление о сути дела.
В Unix-системах имеется две основные программы pager'а - more и less.
Первая из них допускает только однонаправленный (вперед) просмотр и имеет слабые интерактивные возможности. Почему ныне и представляет лишь исторический интерес, так что о ней я говорить не буду. Тем более, что в современных свободных POSIX-системах она как таковая отсутствует: файл с именем /usr/bin/more, который можно обнаружить во FreeBSD и некоторых дистрибутивах Linux, на самом деле представляет собой жёсткую или символическую ссылку на ту же самую программу, что и команда less. Хотя эта программа проявляет несколько различные свойства, в зависимости от того, какой из указанных команд она вызвана, функции ее от этого не меняются. Так что дальше я буду говорить только о команде less.
Самый простой способ вызова команды
$ less filename после чего на экран выводится содержимое файла, указанного в качестве аргумента, по которому можно перемещаться в обоих направлениях, как построчно, так и постранично. В нижней строке экрана можно видеть символ двоеточия - приглашения для ввода команд различного назначения. В
частности, нажатие клавиши h выводит справку по использованию less, а клавиши q - выход из программы просмотра (или из просмотра справочной системы, если она была перед этим вызвана). Если команда была вызвана как more (это достигается ещё и специальной опцией - less -m), вместо символа двоеточия в нижней строке будет выведено имя файла с указанием процента просмотра:
command.txt 3% что, однако, не воспрещает и здесь давать ее встроенные команды —
вводом символа двоеточия (:) и закрепленной за командой литеры (или их сочетания).
Большинство встроенных команд less предназначено для навигации по телу файла. Осуществляется она несколькими способами:

с помощью стандартных клавиш управления курсором: PageDown или
Spacebar (вперед на один экран), PageUp (назад на один экран), Down или Enter (вперед на одну строку), Up (назад на одну строку), Right (на
пол-экрана вправо, Left (на пол-экрана влево с помощью предопределенных клавишных комбинаций, сходных с управляющими клавиатурными последовательностями командных оболочек и таких текстовых редакторов, как emacs и joe (хотя и не всегда сними совпадающими Control+V (на один экран вперед, Escape-
V (на один экран назад, Control+N (на одну строку вперед, Control+P (на одну строку назад с помощью фиксированных символьных клавиш, иногда подобных таковым командного режима редактора vi: z и w (впереди назад на один экран, e и y (впереди назад на одну строку, можно использовать также привычные по vi клавиши j и k, соответственно, d и u (впереди назад на пол-экрана). Последний способ интересен тем, что допускает численные аргументы перед символьной командой так, нажатие 3e приведет к перемещёнию натри строки вперед, а 2w - на два экрана назад.
Помимо плавной, так сказать, навигации, можно перемещаться по файлу и скачками (jumping): нажатие клавиши с символом g (или последовательности Escape-<) позволяет переместиться к первой строке файла, клавиши G (регистр важен! дублирующий вариант - Escape->) - к последней его строке,
клавиши p
- к началу файла.
Кроме навигации, имеется и возможность двустороннего поискав направлении как конца, таки начала файла. Для поиска вперед требуется ввести символ прямого слэша (/) и за ним - искомое сочетание символов.
Поиск в обратном направлении предваряется символом вопроса (?). В обоих случаях в шаблоне поиска можно использовать стандартные регулярные выражения *, ?, [список_символов] или [диапазон_символов]. Нажатие клавиши n (в нижнем регистре) приводит к повторному поиску в заданном ранее направлении, клавиши N (в верхнем регистре) - к поиску в направлении противоположном.
Управляющие комбинации команды less могут быть переопределены с помощью команды lesskey. Формат ее lesskey -o output input В качестве входных данных выступает простой текстовый файл (по умолчанию -
/.lesskey, однако его следует создать самостоятельно),
описывающий клавишные последовательности в следующем, например, виде
\r forw-line
\n forw-line k back-line
Выходные данные - создаваемый из текстового двоичный файл, который собственно и используется командой less. Стандартное для него имя - Команда less допускает одновременный просмотр нескольких файлов. Для этого ее следует вызвать в форме less file1 file2 ... file# после чего между открытыми файлами можно переключаться посредством :n (к следующему файлу, :p (к предыдущему файлу, :x (к первому файлу. Путем нажатия :d текущий файл исключается из списка просмотра. Символ двоеточия во всех этих случаях вводится с клавиатуры в дополнение к
приглашению на ввод команд.
Команда less имеет великое множество опций - описание их на странице экранной документации занимает более дюжины страниц, поэтому задерживаться на них я не буду. Следует заметить только, что опции эти могут использоваться не только в командоной строке при запуске less, но и интерактивно - после символа дефиса в приглашении ввода. Так, указав там, можно включить т.н. промежуточный формат приглашения (с отображением процентов просмотренного объёма файла, ас помощью -M - длинный (подобный) формат, при котором в приглашении дополнительно указываются имя файла, его положение в списке загруженных файлов, просматриваемые ныне строки (file 2 of 10) lines 1-29/1364 2% Значение команд постраничного просмотра файлов ещё ив том, что именно сих помощью осуществляется доступ к экранной документации (man- страницам. Команда man cmd_name как было описано в предыдущей интермедии, на самом деле вызывает определенный по умолчанию pager для просмотра соответствующего файла. Какой именно - определяется переменной в пользовательских настройках.
Кроме команд постраничного просмотра, существуют команды для просмотра фрагментарного. Это - head и tail, выводящие на экран некоторую фиксированную порцию файла, указанного в качестве их аргумента, сначала или с конца, соответственно. По умолчанию эта порция для обеих команд составляет десять строк (включая пустые. Однако ее можно переопределить произвольным образом, указав опции -n [число_линий] или [количество_байт]. Например, команда head -n 3 filename выведет три первые строки файла filename, а команда tail -c 100 filename его последние 100 байт. При определении выводимого фрагмента в строках
название опции (n) может быть опущено - достаточно числа после знака дефиса.
Существуют и средства просмотра компрессированных файлов. Для файлов,
сжатых программой gzip, можно использовать команды zcat и zmore, для спрессованных командой bzip2 - команду bzcat. Использование их ничем не отличается от аналогов для несжатых файлов - в сущности, именно они и вызываются для обеспечения просмотра. В случае команды zmore, как нетрудно догадаться, на самом деле используется команда less (сама по себе она аналога для компрессированных файлов не имеет).
Сравнение, объединение и деление файлов
Следующая важная группа операций над контентом файлов - сравнение файлов по содержанию и различные формы объединения файлов и их фрагментов. Начнем со сравнения. Простейшая команда для этого - cmp в форме cmp file1 fil2 производит построчное сравнение файлов, указанных как первый и второй аргументы (а более их и не предусмотрено, все указанное после второго аргумента игнорируется. В случае идентичности сравниваемых файлов не происходит ничего, кроме возврата приглашения командой строки. Если же между файлами имеются различия, выводится номер первого различающегося символа и номер строки, в которой он обнаружен file2 differ: char 27, line 4 Это означает, что различия между файлами начинаются с го от начала файла символа (включая пробелы, символы конца строки т.д.), который имеет место быть в строке 4. С помощью опций -l и -z можно заставить команду cmp вывести номера всех различающихся символов в десятичном или шестнадцатеричном формате, соответственно.
Более информативный вывод обеспечивает команда diff. Она также осуществляет построчное сравнение двух файлов, но выводит список строк, в которых обнаружены отличия. Например, для двух файлов вида less file1 line 1 line 2 line 3 line 4 line 5 и file2 line 1
line 2 line 3 line 3a line 4 line 5 это будет выглядеть следующим образом diff file1 file2 3a4
> line 3a Если различия будут выявлены более чем водной строке, для каждого расхождения будет выведен аналогичный блок. Смысл его - в том, какие строки первого файла должны быть преобразованы, и как именно, для того,
чтобы файлы стали идентичными. Первая линия блока вывода содержит номер строки первого файла, подлежащей преобразованию, номер соответствующей строки второго файла и обозначенное буквенным символом преобразование, во второй линии приведена собственно строка - предмет преобразования.
Символы преобразования- следующие (от append) указывает на строку, отсутствующую в первом файле, но присутствующую во втором

c (от change) фиксирует строки с одинаковым номером, но разным содержанием

d (от delete) определяет строки, уникальные для первого файла. То есть в данном примере для преобразования file1 в file2 в него после строки 3 должна быть вставлена строка 4 из второго файла, что символизирует вторая линия блока - > line 3a, где > означает строку из первого сравниваемого файла. Если же аргументы команды diff дать в обратном порядке, вывод ее будет выглядеть следующим образом diff file2 file1 4d3
< line 3a показывающим, что для достижения идентичности из file2 должна быть удалена четвертая строка (< line 3a, где < означает строку из второго файла). Если же произвести сравнение file1 с file3, имеющим вид
$ less file3
line 1 line 2 line 3a line 4 line 5 то вывод команды diff file1 file3 3c3
< line 3
---
> line 3a будет означать необходимость замены третьей строки из file1 (символ <) на третью строку из file3 (символ >).
Такая форма вывода команды diff называется стандартной. С помощью опции -c можно задать т.н. контекстную форму вывода, при которой на экран направляется не только различающиеся строки, но и строки, их окружающие
(то есть контекст, в котором они заключены -c file1 file2
*** file1 Sun May 12 11:44:44 2002
--- file2 Mon May 13 15:17:27 2002
***************
*** 1,5 ****
--- 1,6 ---- line 1 line 2 line 3
+ line 3a line 4 line 5 Количество строк контента задается опцией -C:
diff -C 1 file1 file2 ttyv1
*** file1 Sun May 12 11:44:44 2002
--- file2 Mon May 13 15:17:27 2002
***************
*** 3,4 ****
--- 3,5 ---- line 3
+ line 3a line 4 В этом примере значение опции -C (единица) предписывает вывод по одной строке контекстного окружения вокруг различающейся строки. Сами же различающиеся строки помечаются следующим образом знаком - (минус, или дефис) - строки, подлежащие удалению из первого файла, знаком + (как в примере) - строки, которые должны быть добавлены, знаком ! - просто различающиеся строки.
Кроме контекстного формата, используется ещё и вывод в унифицированном формате, что предписывается опцией -U значение, в качестве значения указывается число строк. В нем для обозначения изменяемых строк используются только символы + и -, асам вывод чуть короче, чем при использовании контекстного формата.
С помощью многочисленных опций команды diff сравнение файлов может быть детализовано и конкретизировано. Так, опция -b предписывает игнорировать пустые символы пробелов и табуляции в конце строка опция - вообще лишние пробелы (и те, и другие обычно имеют случайное происхождение. При указании опции -B игнорируются пустые строки, то есть не содержащие никаких иных символов, кроме перевода каретки строки с символами табуляции или пробела как пустые не рассматриваются, для их игнорирования требуется опция -w. Благодаря опции -i при сравнении не принимается во внимание различие регистров символов, а опция -I regexp определяет регулярные вырвжения, строки с которыми также игнорируются при сравнении.
В качестве аргументов команды diff (одного или обоих) могут выступать также каталоги. Если каталогом является только один из аргументов, для сравнения в нем отыскивается файл, одноименный второму аргументу. Если же оба аргумента суть каталоги, в них происходит сравнение всех одноимённых файлов в алфавитном порядке (вернее, в порядке кода первого символа имени, разумеется. Благодаря опции -r сравнение файлов может осуществляться и во вложенных подкаталогах.
Вывод команды diff может быть перенаправлен в файл. Такие файлы различия именуются файлами или, применительно к исходным текстам программ, патчами (patches), о которых будет сказано несколько позже.
Именно с помощью таких патчей обычно распространяются изменения к
программам (дополнения, исправления ошибок и т.д.).
В принципе, команда diff и придумана была именно для сравнения файлов исходников, над которыми ведут работу несколько (в пределе - неограниченное количество, как в случае с Linux) человек. Однако невозбранно и ее использование в мирных целях - то есть для сравнения просто повествовательных текстов. Единственное, что следует понимать при этом абсолютно ясно - то, что diff выполняет именно построчное сравнение. То есть сравнение последовательностей символов, ограниченных символами конце строки с обеих сторон. И, соответственно, непрерывная абзацная строка в стиле emacs и vi - совсем не тоже самое, что строка, образуемая в редакторе joe на границе экрана. Впрочем, это - вопрос, к которому ещё не раз придется возвращаться.
Как уже было отмечено, команда diff осуществляет сравнение двух файлов
(или - попарное сравнение файлов из двух каталогов. Однако, поскольку Бог,
как известно, любит троицу, есть и команда diff3, позволяющая сранить именно три файла, указываемые в качестве ее аргументов. По действию она несильно отличается от двоичного аналога. И потому изучение ее особенностей предлагается в качестве самостоятельного упражнения приверженцам троичной идеологии.
Существуют и средства для сравнения сжатых файлов. Это - zcmp и Подобно командам просмотра, ими просто вызываются соотвествтующие команды cmp и diff. И потому использование их не имеет никаких особенностей.
От вопроса сравнения файлов плавно перейдем к рассмотрению способов их объединения. Для этого существует немало команд, из которых по справедливости первой должна идти команда cat, поскольку именно сие есть ее титульная функция (cat — от concatenation, сиречь объединения. Ранее уже упоминалось, что она способна добавлять информацию со стандартного ввода вконец существующего файла. Однако дело этим не ограничивается. В
форме
$ cat file1 file2 ... file# > file_all она создает новый файл, включающий в себя содержимое всех файлов- аргументов (и именно в том порядке, в каком они приведены в командной строке. Операция, казалось бы, нехитрая - однако представьте, сколько действий потребовалось бы в текстовом процессоре (например, в е) для того, чтобы создать синтетический вариант из полутора десятков фрагментов, раскиданных по разным каталогам?
А вот команда patch выступает в качестве диалектической пары для команды diff, именно она вносит в файл те изменения, которые документируются последней. Выглядит эта команда примерно так patch file1 diff_file в ответ на что последует нечто вроде следующего вывода. Looks like a normal diff to me...
Patching file file1 using Plan A...

Hunk #1 succeeded at 4. done В результате исходная версия file1 будет сохранена под именем file1.orig, асам он преобразован в соответствие с описанием файла. Возможна и форма patch < diff_file
В этом случае команда patch попытается сама определить имя файла- оригинала, и, если это ей не удастся, даст запрос на его ввод. Обращаю внимание на символ перенаправления ввода, поскольку если его опустить,
имя dif-файла будет воспринято как первый аргумент команды (то есть имя файла-оригинала).
В качестве второго аргумента команды patch могут использоваться dif- файлы не только в стандартном, но и в контекстном или унифицированном формате. Это следует указать посредством опции -c или -u, соответственно.
Сочетание команд diff и patch очень широко используется при внесении изменений в исходные тексты программы. В частности, они применяются для внесения дистрибутив-специфичных изменений в deb-пакеты репозиториев
Ununtu и Mint.
Не менее часто, чем в слиянии, возникает и необходимость в разделении файлов на части. Цели этой служит команда split. Формат ее:
$ split [options] filename [prefix]
В результате исходный файл будет разбит на несколько отдельных файлов вида prefixaa, prefixab и так далее. Значение аргумента prefix по умолчанию - x
(то есть без его указания итоговые файлы получат имена xaa, xab и т.д.).
Опции команды split задают размер выходных файлов - в байтах (опция -b)
или количестве строк (опция -l). Первой опцией в качестве единицы, кроме байтов, могут быть заданы также килобайты или мегабайты - добавлением после численного значения обозначения k или m, соответственно.
Команда split может использоваться для разбиения файлового архива на фрагменты, соответствующие размеру резервных носителей. Так, в форме
$ split -b 1474560 arch_name она обеспечит разбиение архива на части, какждая из которых может быть записана на стандартную трехдюймовую дискету. А посредством
$ split -b 650m arch_name архив можно подготовить к записи на носители CD-R/RW. Легко догадаться,
что обратное слияние таких фрагментированных файлов можно выполнить командой cat.
В BSD-реализации команды split имеется опция -p (от pattern — шаблон),
благодаря которой файл может быть разделена на фрагменты, ограниченные строками, содержащими текст, приведенный в качестве значения шаблона.
реализация команды split таким свойством не обладает. Однако взамен этому весть команда csplit, именно для разделения файла по шаблону и предназначенная.
Показать, как она работает, проще всего на конкретном примере.
Предположим, у нас имеется книга в формате Plain Text, состоящая из введения и 23 глав, которую надо разбить на соответствующее количество фрагментов. Для этого сочиняется такая командная конструкция csplit -f chapter mybook.txt 'Глава' {23} Здесь опция -f задаёт маску имён файлов, на которые будет разбит исходный текст (то есть файл mybook.txt). Шаблон, по которому будет выполняться разбиение — слово Глава ограничено прямыми слэшами и заключено в строгие кавычки. А число в фигурных скобках указывает,
сколько раз надо повторить процедуру разбиения по заданному шаблону. Ив результате мы получаем серию файлов вида chapter##, где файл будет включать текст от начала до первой строки со словом Глава (которая,
как ни странно, будет главой первой, chapter01 — от строки Глава первая до
Главы второй, итак далее. Исходный файл при этом останется в неприкосновенности.
Поиск в файлах grep сотоварищи
В одном из предыдущих разделов говорилось о поиске файлов посредством команды find. Ныне же речь пойдет о поиске внутри файлового контента - то есть поиске текстовых фрагментов. Для этого в системах используется семейство утилит grep — собственно grep, egrep и fgrep, несколько различющихся функционально. Впрочем, в большинстве систем все это суть разные имена (жёсткие ссылки) одной и той же программы, именуемой GNU- реализацией grep, включающей ряд функций, свойственных ее расширенному аналогу, egrep. Соответственно, поиск текстовых фрагментов в файлах может быть вызван любой из этих команд, хотя в каждом случае функциональность их будет несколько различаться.
Однако начнем по порядку. Самой простой формой команды grep является следующая grep pattern files где pattern - искомая последовательность символов, а files - файлы, среди которых должен производиться поиск (или - просто одиночный файл. В
указании имен файлов допустимы обычные маски, например, командой grep line ./* будут найдены строки вида line во всех файлах текущего каталога. Шаблон для поиска не обязан быть односложным. Правда, если в нем используются последовательности символов, разделенные пробелами, последние должны тем или иным способом экранироваться, иначе в качестве шаблона будет воспринято только первое слово. Например, каждый пробел может предваряться символом обратного слэша (\), или просто все искомое выражение заключается в одинарные или двойные кавычки.
Шаблоны могут включать в себя регулярные выражения. причём список
таковых для команды grep существенно шире, чем для команд манипулирования файлами. Так, кроме маски любой последовательности символов (*), любого одиночного символа (?), списка и диапазона символов и [a-z]), могут встречаться. (точка) - маска любого одиночного (нов отличие от маски обязательно присутствующего) символа то есть при задании шаблона lin. будут найдены строки, содержашие line или lins, ноне и $ - маски начала и конца строки, соответственно по шаблону, будут найдены строки, начинающиеся с соответствующего слова,
по шаблону же line$ - им заканчивающиеся маски повторения предыдущего шаблона, \{n\} - ровно n раз, \{n,\} - не менее n раз, \{,m\} - не более m раз, \{n,m\} - не менее n разине более m раз. Маски повторения относятся к так называемым расширенным регулярным выражениям. Для их использования команда grep должна быть дана с опцией или в форме egrep — последняя часто определяется в общесистемном или пользовательском профильном файле как псевдоним команды grep:
alias grep='egrep -s' или alias grep egrep в оболочках семейств shell и csh, соответственно.
При этом становятся доступными и другие возможности поиска - например,
нескольких текстовых фрагментов (соедниненных логическим оператором
«ИЛИ») одновременно. Делается это двояко. Первый способ - просто перечисление искомых фрагментов, каждый из которых предваряется опцией (и при необходимости экранируется кавычками grep -e pattern1 -e pattern2 files При втором способе оператор между искомыми шаблонами задается в явном виде egrep 'pattern1|pattern2' files Таким способом очень легко, например, составить оглавление для длинного текста (при наличии некоторой системы рубрикации в нем, разумеется. Для этого достаточно дать команду вроде следующей egrep 'Часть|Глава|Раздел|Параграф' filename Для текста, включающего html- или разметку, роль рубрик могут выполнять соответствующие ее элементы, например egrep '
Каталог: wp-content -> uploads -> 2016
2016 -> Государственное областное бюджетное
2016 -> В. П. Зинченко писал о том, что если человек в детстве не дополучил некую норму участия в игровом времяпрепровождении, он приобретает социально-психологическую ущербность вроде «игровой дистрофии», которую в последу
2016 -> Общешкольное родительское собрание «Об ответственности родителей за воспитание детей»
2016 -> 1 июня 2016 года Международный день защиты детей 1 июня
2016 -> «Формирование социально-нравственной позиции дошкольников посредством введения сказочных сюжетов в компьютерные дидактические игры»
2016 -> Принята Утверждена
2016 -> Конкурс по разработке компьютерных игр патриотической направленности «патриот by»


Поделитесь с Вашими друзьями:
1   ...   8   9   10   11   12   13   14   15   ...   30


База данных защищена авторским правом ©nethash.ru 2019
обратиться к администрации

войти | регистрация
    Главная страница


загрузить материал