
|
|
Главная \ Методичні вказівки \ РАБОТА С ФАЙЛАМИ И КАТАЛОГАМИ
РАБОТА С ФАЙЛАМИ И КАТАЛОГАМИ« Назад
РАБОТА С ФАЙЛАМИ И КАТАЛОГАМИ 05.07.2016 06:38
Работа с файлами и каталогами
Понятие файла и файловой системы Файловая система – это часть операционной системы, назначение которой состоит в том, чтобы организовать эффективную работу с данными, хранящимися во внешней памяти, и обеспечить пользователю удобный интерфейс при работе с такими данными. Под файлами понимается логически связанная совокупность данных, ассоциированная с носителем информации и внешним устройством. Файл является абстрактным понятием, и его свойства не зависят от носителя информации. Информация на носителях информации может храниться только в виде файлов. Однажды созданный файл становится независимым от процесса, пользователя и системы, создавшей его. Каждый файл характеризуется некоторым количеством атрибутов, которые варьируются в зависимости от операционной системы. Типичный набор атрибутов включает следующие: Имя. Символьное имя файла является единственным атрибутом, хранимым в форме пригодной для чтения человеком. Тип. Информация, необходимая для управления файлами. Расположение. Указатель на внешнее устройство и на местонахождения файла на этом внешнем устройстве. Размер. Текущий размер (в байтах, словах или блоках) и, возможно, максимально допустимый размер. Защита. Информация управления доступом, управляющая уровнем доступа (чтение, запись, выполнение и т.д.) Время, дата и идентификатор пользователя. Эта информация может характеризовать: создание, последнюю модификацию, последнее обращение. Файловая система хранит информацию о каждом файле в структуре, называемой индексным дескриптором. Каждый индексный дескриптор содержит около 40 полей, в том числе имя файла, тип, размер, количество жестких ссылок, информацию о владельце файла, о правах доступа к нему, дату/время последней модификации файла и дату/время последнего доступа к нему. Именно с индексным дескриптором работает ОС при обращении к файлу.
Типы файлов В операционной системе (ОС) Unix поддерживаются несколько типов файлов: - Обычные файлы. Это просто последовательность байтов; на структуру таких файлов не накладывается никаких ограничений – это могут быть текстовые документы, исполняемые программы, мультимедийные данные. - Каталоги. Каталог — это файл, содержащий имена находящихся в нем файлов, а также указатели на дополнительную информацию — метаданные, позволяющие операционной системе производить операции над этими файлами. Каталоги определяют положение файла в дереве файловой системы, поскольку сам файл не содержит информации о своем местонахождении. Каталог, на который есть ссылка в данном каталоге, называется подкаталогом или вложенным каталогом. Родительским называется каталог, в котором содержится данный каталог. Для корневого каталога (см. ниже) родительским является он сам. - Ссылки. Делятся на 2 типа: 1) «Жесткие» ссылки. На файл можно ссылаться из нескольких каталогов одновременно и даже из нескольких элементов одного и того же каталога, причем у всех ссылок могут быть разные имена. Это создает иллюзию того, что файл в одно и то же время находится в разных каталогах. Атрибуты файла при этом являются общими для всех ссылок. Unix подсчитывает количество ссылок, указывающих на каждый файл, и при удалении файла не освобождает блоки данных до тех пор, пока не будет удалена последняя ссылка на него. Ссылки такого рода называются «жесткими». Они не являются отдельным типом файлов. Жесткую ссылку в Unix невозможно отличить от имени файла – они идентичны. 2) Символические ссылки («мягкие»). Этот вид ссылок является отдельным типом файлов и обеспечивает возможность вместо путевого имени указывать псевдоним. Когда ядро ОС сталкивается с символической ссылкой при поиске файла, оно извлекает из нее хранящееся путевое имя. Различие между жесткими и мягкими ссылками состоит в том, что жесткая ссылка является прямой – то есть указывает непосредственно на индексный дескриптор файла, тогда как мягкая ссылка указывает на файл по имени. Файл, адресуемый символической ссылкой, и сама ссылка являются разными объектами файловой системы. Файл, на который создается символическая ссылка, не обязательно должен существовать. При удалении файла автоматически уничтожаются все связанные с ним символические ссылки. - Специальные файлы устройств. Файлы устройств позволяют Unix-программам взаимодействовать с аппаратными средствами и периферийными устройствами системы. За всю работу по управлению конкретным устройством отвечает специальная программа, называемая драйвером устройства. Драйверы устройств образуют стандартный коммуникационный интерфейс, который выглядит для пользователя как обычный файл. Когда ядро ОС получает запрос к файлу устройства, оно просто передает этот запрос соответствующему драйверу, то есть файлы устройств можно представить как шлюзы, через которые драйверам передаются запросы. В UNIX различают символьные и блочные файлы устройств. Символьные файлы устройств используются для небуферизированного обмена данными с устройством, в противоположность этому блочные файлы позволяют производить обмен данными в виде пакетов фиксированной длины — блоков. Доступ к некоторым устройствам может осуществляться как через символьные, так и через блочные специальные файлы. - Сокеты.Сокеты инкапсулируют соединения между процессами, позволяя им взаимодействовать, не подвергаясь влиянию других процессов. Обращение к ним осуществляется через соответствующие объекты файловой системы. Несмотря на то, что эти объекты распознаются как файлы, процессы, не участвующие в соединении, не могут осуществлять над файлами сокетов операции чтения и записи. Однако, в отличие от обычных файлов, сокеты представляют собой виртуальный объект, который существует, пока на него ссылается хотя бы один из процессов. - Именованные каналы. Подобно сокетам, именованные каналы обеспечивают взаимодействие двух процессов, выполняемых на одном компьютере.
Структура файловой системы Unix Файловая система ОС Unix имеет иерархическую (древовидную) структуру, основанием которой является корневой каталог, который имеет имя /. Корневой каталог файловой системы Unix всегда один. Расположение файлов в файловом дереве не определяется их расположением на том или ином физическом или логическом диске. Файловые структуры, находящиеся на различных дисках, в том числе на дисках других компьютеров, с помощью специальной команды (mount) монтируются на файловое дерево Unix, становясь частью единого файлового дерева. Все операции над файлами с точки зрения пользователя выполняются одинаковым образом, независимо от их физического месторасположения.
Kорневой каталог Unix обычно содержит такие каталоги, как:
Последовательность имен каталогов, разделенных символом «/», ведущая от некоторого каталога к каталогу, в котором располагается данный файл, называется маршрутом к этому файлу. Последовательность имя_маршрута/имя_файла называется путевым именем файла. Если путевое имя отсчитывается от корневого каталога, оно называется абсолютным (полным), в противном случае – относительным. Например, каталог /usr, кроме прочего, содержит такие каталоги, как:
Полные имена этих каталогов будут такими: /usr/bin, /usr/include и /usr/lib Если в каталоге /usr/bin содержится файл perl, то полное имя файла perl будет таким: /usr/bin/perl Если же пользователь в данный момент находится в каталоге /usr файловой системы и ему необходимо открыть файл /usr/include/sys/conf, то он может обратиться к этому же файлу по относительному имени: include/sys/conf Существует два специальных имени:
В качестве имен файлов, как правило, может использоваться любая последовательность из букв, цифр и спецсимволов, кроме символа «/». Причина этого ограничения очевидна: данный символ используется как разделитель имен в составе пути, поэтому не должен встречаться в самих именах. Длина имени ограничивается 256 символами. Прописные и строчные буквы в именах файлов различаются. Например, файл myfile и файл myFile – это разные файлы. Имя файла может включать в себя расширение, обычно используемое для указания на тип файла. Расширение определяется как часть имени файла, располагающаяся после последней точки. Файлы, имена которых начинаются с точки, являются скрытыми. Есть несколько символов, допустимых в именах файлов и каталогов, которые нужно использовать с осторожностью. Это так называемые спецсимволы: «*», «\», «&», «<», «>», «;», «(«, «)», «|», а также символы пробела и табуляции. Дело в том, что эти символы имеют специальное значение, поэтому нужно будет специально позаботиться о том, чтобы эти символы воспринимались как часть имени файла или каталога. Для этого необходимо предварить спецсимвол символом «\» (обратный слэш).
Шаблоны подстановки Используя специальные символы, можно формировать шаблоны имен файлов.
Примеры:
Если в имя файла должен входить какой-либо спецсимвол, то при указании шаблона этот спецсимвол необходимо предварять с помощью обратного слэша («\»), или экранировать, например:
При использовании диапазонов символов следует учитывать, что они могут зависеть от выбранных настроек локализации. Например, диапазон [b-e] означает символы от b до е включительно. В английском языке, где сортировка букв идет по порядку (ABC…XYZabc…xyz), указанному набору соответствует набор символов b, c, d, e. Согласно правилам русского языка, сортировка тех же символов идет в другом порядке (аАбБвВ…эЭюЮяЯaAbBcC…xXyYzZ) и тому же диапазону соответствуют символы b, B, c, C, d, D, е. Для решения таких проблем имеются объявления некоторых классов и категорий символов:
Командная оболочка, командная строка и командыДля организации интерфейса пользователя в состав Unix входит командная оболочка, называемая shell. Она выполняет следующие функции:- организует исполнение программ, проверяя их синтаксис, допустимость ключей и т.д.; - осуществляет генерацию имен файлов; - осуществляет переназначение ввода и вывода; - организует конвейеризацию; - осуществляет контроль среды окружения; - является интерпретатором развитого командного языка, позволяющего пользователю создавать сложные сценарии выполнения программ. Существуют различные версии shell, наиболее популярными из них являются sh (Bourne Shell), bash (Bourne Again Shell), csh (C-Shell), ksh (Korn Shell). Мы будем рассматривать bash, обычно загружаемую ОС по умолчанию. Командная строка имеет следующий вид:
$ команда ключи аргументы
Символ «$» является приглашением командной оболочки, ему могут предшествовать другие символы, отмечающие, например, имя текущего каталога, имя компьютера, имя пользователя или имя ОС. Командная оболочка обрабатывает команды трех типов. Во-первых, в качестве имени команды может быть указано имя исполняемого файла в объектном коде, полученного в результате компиляции исходного текста программы (например, на языке С). Во-вторых, именем команды может быть имя командного файла, содержащего набор инструкций, обрабатываемых командной оболочкой (такие файлы называются сценариями или скриптами). В-третьих, команда может быть внутренней командой языка shell. Внутренние команды языка shell представляют собой программы, находящиеся в каталоге /usr/bin. Большинство из них имеют следующий формат:
имя_команды ключи аргументы
Ключи служат для модификации режимов работы команды и представляют собой наборы определенных символов, которым предшествует символ «-» (короткие имена ключей) или комбинация «--» (длинные имена ключей). Чаще всего в качестве короткого имени ключа используется начальная буква действия, которое определяется данным ключом, например ключ -u – это сокращение от user. Свойство ключа быть, с одной стороны, предельно коротким, а с другой стороны – информативным, называется аббревиативностью. Не только ключи, но и имена наиболее распространенных команд Unix обладают этим свойством. Аббревиативность ключей трудно соблюсти, когда их у команды слишком много. Некоторые буквы латинского алфавита (например, s или o) используются очень часто, и могли бы служить сокращением сразу нескольких команд. На такой случай существует другой, полнословныйформат: ключ начинается на двазнака «-», за которыми следует полное имя ключа. Таков, например, ключ --wildcards. А некоторые ключи могут обозначаться как коротким, так и полным именем, например ключ с коротким именем -h имеет аналог с длинным именем --help. Аргументы команды (или параметры команды) указывают на объекты, над которыми выполняются операции. Аргументами команд в большинстве случаев являются имена файлов. Например, приведенная ниже команда означает: «Выполнить команду ls (отображение информации о файле) с ключом -l (подробная информация) для файла а.out»:
ls -l а.out
Если необходимо использовать два и более однобуквенных ключа, большинство команд позволяют объединять их. Например, две приведенные ниже команды идентичны:
ls -lg a.out
1s -l -g a.out
Некоторые ключи требуют наличия параметра. В этом случае параметр дается после ключа, в этом случае последний нельзя объединять с другим ключом. В одной строке может содержаться несколько команд. Они отделяются друг от друга символом «;». Одну команду можно разместить на нескольких экранных строках. Для этого перед нажатием клавиши [Enter] необходимо поставить символ «\». Командный процессор shell ищет имена команд в указанном наборе каталогов, который можно изменить по желанию пользователя. Список этих каталогов является значением переменной среды PATH.
Получение справки о командах Unix Получить справку о работе команд Unix можно несколькими способами.
1. Страницы руководства (manpages) содержат больше всего полезной информации. Каждая страница руководства посвящена какому-нибудь одному объекту системы. Для того чтобы посмотреть страницу руководства по какой-либо команде, нужно дать команду
man [номер_раздела] [имя_объекта]
Номера и названия разделов руководства:
Например, если нужно просмотреть справку о работе команды find, необходимо выполнить команду
man 1 find
Как правило, команда man сама находит раздел с требуемой справкой, просматривая все разделы по очереди, поэтому для получения справки по команде find достаточно ввести
man find
Для получения списка разделов, в которых встречается требуемый термин используется ключ -l. Страница руководства занимает, как правило, больше одной страницы экрана. Страницы перелистываются вниз с помощью клавиши пробела или клавиши [Page Down], вверх – с помощью клавиши [Page Up], для сдвига на одну строку вперед можно применять Enter или клавишу [Стрелка вниз], а на одну строку назад – клавишу [Стрелка вверх]. Переход на начало и конец текста выполняется по нажатию клавиш [g] и [G] соответственно (Go). Выход осуществляется по нажатию клавиши [q] (Quit).
2. Info Другой источник информации о Unix и составляющих ее программах – справочная подсистема info. Страница руководства, несмотря на обилие ссылок различного типа, остается линейным текстом, структурированным только логически. Документ info структурирован прежде всего топологически – это настоящий гипертекст, в котором множество небольших страниц объединены в дерево. В каждом разделе документа info всегда есть оглавление, из которого можно перейти сразу к нужному подразделу, откуда всегда можно вернуться обратно. Кроме того, info-документ можно читать и как непрерывный текст, поэтому в каждом подразделе есть ссылки на предыдущий и последующий подразделы: Одна или несколько страниц, которые можно перелистывать клавишей [Пробел] или [Page Up]/[Page Down] – это узел (node). Узел содержит обычный текст и меню (menu) – список ссылок на другие узлы, лежащие в дереве на более низком уровне. Ссылки внутри документа имеют вид * имя_узла::, и перемещать по ним курсор можно клавишей [Tab], а переходить к просмотру выбранного узла – клавишей [Enter]. Вернуться к предыдущему просмотренному узлу можно клавишей [l] (Last). Выйти из программы info можно, нажав [q] (Quit). Более подробную справку об управлении программой info можно в любой момент получить у самой info, нажав [?]. Узлы, составляющие документ info, можно просматривать и подряд, один за другим (с помощью команд [n] (Next) и [p] (Previous)), однако это используется нечасто. В верхней строке экрана info показывает имя текущего узла, имя следующего узла и имя родительского (или верхнего) узла, в котором находится ссылка на текущий.
3. Использование ключей -h и --help У каждой команды Unix есть ключ -h и эквивалентный ему ключ --help, и пользователь, запустив команду с одним из этих ключей, может просмотреть краткую справку об использовании данной команды.
Домашние каталоги пользователейВ Unix у каждого пользователя обязательно есть собственный каталог, который и становится текущим сразу после регистрации в системе – домашний каталог. Домашние каталоги пользователей хранятся в каталоге /home. Например, для пользователя anna домашним каталогом является /home/anna. Домашний каталог (home directory) – это каталог, предназначенный для хранения собственных данных пользователя Unix. Как правило, домашний каталог является текущим непосредственно после регистрации пользователя в системе. Полный путь к домашнему каталогу хранится в переменной среды HOME. Поскольку каждый пользователь располагает собственным каталогом и по умолчанию работает в нем, решается задача разделения файлов разных пользователей. Обычно доступ других пользователей к чужому домашнему каталогу ограничен: наиболее типична ситуация, когда пользователи могут читать содержимое файлов друг друга, но не имеют права их изменять или удалять. Операции над файлами и каталогами
Определение имени текущего каталога Команда pwd(от англ. print working directory – напечатать имя рабочего каталога), вызываемая без параметров, возвращает полный путь текущего каталога, в котором находится пользователь.
Получение информации о каталоге или файле Чтобы иметь возможность ориентироваться в файловой системе, нужно знать, что содержится в каждом каталоге. Запомнить всю структуру файловой системы невозможно и не нужно: в любой момент можно просмотреть содержимое любого каталога при помощи команды ls (от англ. list - список). Поданная без параметров, команда ls выводит список файлов и каталогов, содержащихся в текущем каталоге. Команда ls принимает в качестве параметра имя каталога, содержимое которого нужно вывести. Имя может быть задано любым доступным способом: в виде полного или относительного пути. Например, чтобы получить список файлов в каталоге /usr/sbin, необходимо использовать команду
ls /usr/sbin
У команды ls есть множество ключей, которые нужны главным образом для того, чтобы выводить дополнительную информацию о файлах в каталоге или выводить указанный список файлов (вместо указания имен файлов можно использовать шаблоны). Ниже приведены наиболее употребительные флаги команды ls.
Примеры. Вывод подробной информации о файлах текущего каталога, имена которых начинаются и заканчиваются на цифру с применением различных цветов:
ls –l ./[0-9]*[0-9] --color
Вывод подробной информации о содержимом каталога /usr/lib без содержимого вложенных каталогов и отображение имен файлов в обратном алфавитном порядке:
ls –ldr /usr/lib
Перемещение по дереву каталогов Пользователь может работать с файлами не только в своем домашнем каталоге, но и в других каталогах. В этом случае будет удобно сменить текущий каталог, т. е. переместиться в другую точку файловой системы. Для смены текущего каталога командной оболочки используется команда cd(от англ. change directory - сменить каталог). Команда cdпринимает один параметр: имя каталога, в который нужно переместиться - сделать текущим. Как обычно, в качестве имени каталога можно использовать полный или относительный путь:
cd /usr/lib
Для перемещения в родительский каталог удобно воспользоваться командой cd .. Необходимость вернуться в домашний каталог из произвольной точки файловой системы возникает довольно часто, поэтому командная оболочка поддерживает обозначение домашнего каталога при помощи символа «~». Поэтому чтобы перейти в домашний каталог из любого другого каталога, достаточно выполнить команду
cd ~
При исполнении команды символ «~» будет заменен командной оболочкой на полный путь к домашнему каталогу пользователя. При помощи символа «~» можно ссылаться и на домашние каталоги других пользователей при помощи конструкции ~имя_пользователя. Например, пользователь anna при выполнении команды
cd ~victor
может перейти в домашний каталог пользователя victor. Команда cd, поданная без параметров, эквивалентна команде cd ~и делает текущим каталогом домашний каталог пользователя.
Создание каталогов Для создания каталога используется команда mkdir (от англ. make directory - создать каталог). Она применяется с обязательным параметром: именем создаваемого каталога (или списком имен каталогов, указанных через пробел). По умолчанию каталог будет создан в текущем каталоге. Например, команда:
mkdir examples texts
приведет к созданию каталогов examples и texts в каталоге, в котором находится в текущий момент создающий их пользователь. Если указать перед именем создаваемого каталога полный или относительный путь к нему, то каталог будет создан в соответствии с указанной иерархией каталогов:
mkdir /home/anna/examples
Созданиефайлов Создание файла осуществляется с помощью команды touch. Вообще говоря, данная команда используется для изменения временных меток доступа (вызывается с ключом -a, --time=access или --time=atime) и модификации (вызывается с ключом -m, Параметром команды touch является имя файла (или список имен файлов через пробел). Например, следующая команда приведет к созданию трех файлов – f1.txt, f2.lst и f3:
touch f1.txt f2.lst f3
Ключ -с (или --no-create) предотвращает создание файла в случае, если он не существует.
Копирование файлов и каталогов Для копирования файлов и каталогов применяется команда cp (от англ. copy – копировать). Команда cpтребует присутствия двух обязательных параметров: первый – копируемый файл или каталог (или их список), второй – файл или каталог назначения. Как обычно, в именах файлов и каталогов можно использовать полные и относительные пути и шаблоны. Синтаксис команды ср:
ср [ключи] имя_исходного_файла/каталога имя_целевого_файла/каталога
Если последний аргумент является именем существующего каталога, то команда ср копирует каждый указанный исходный файл в файл с тем же именем в целевой каталог. Если аргументами команды ср являются имена двух файлов (каталогов), то команда ср копирует исходный файл (каталог) в файл (каталог), имя которого задано целевым файлом (каталогом). Если последний аргумент не является каталогом и при этом задано несколько имен файлов, то команда ср завершается с ошибкой. По умолчанию команда cp, как и многие другие команды, будет работать с файлами в текущем каталоге. Нужно иметь в виду, что в Unix команда cp нередко настроена таким образом, что при попытке скопировать файл поверх уже существующего файла никакого предупреждения не выводится. В этом случае файл будет просто перезаписан, а данные, которые содержались в старой версии файла, безвозвратно потеряны. Поэтому при использовании cpследует всегда быть внимательным и проверять имена файлов, которые нужно скопировать. Некоторые флаги команды ср:
Примеры:
Перемещение/переименование файлов и каталогов Для перемещения файлов и каталогов применяется команда mv (от англ. move – двигать, перемещать). Перемещение файла внутри одной файловой системы в действительности равнозначно его переименованию: данные самого файла при этом остаются на тех же секторах диска, а изменяются каталоги, в которых произошло перемещение. Перемещение предполагает удаление ссылки на файл из того каталога, откуда он перемещен, и добавление ссылки на этот самый файл в тот каталог, куда он перемещен. В результате изменяется полное имя файла – полный путь, т. е. положение файла в файловой системе. У команды mvдва обязательных аргумента: первый – перемещаемый файл или каталог (или их список), второй – файл или каталог назначения. Имена файлов и каталогов могут быть заданы в любом допустимом виде: при помощи полного или относительного пути. Синтаксис команды mv:
mv [ключи] имя_исходного_файла/каталога имя_целевого_файла/каталога
Если последний аргумент является именем существующего каталога, то команда mv переносит каждый указанный исходный файл в файл с тем же именем в целевой каталог. Если аргументами команды mv являются два файла, то команда переименовывает исходный файл в файл, имя которого задано целевым файлом. Если последний аргумент не является каталогом и при этом задано несколько имен файлов, то команда mv завершается с ошибкой. По умолчанию команда mv будет работать с файлами в текущем каталоге. Некоторые флаги команды mv:
Примеры:
Создание ссылок
Жесткие ссылки (hard links) Каждый файл представляет собой область данных на жестком диске компьютера или на другом носителе информации, которую можно найти по имени. В файловой системе Unix содержимое файла связывается с его именем при помощи жестких ссылок. Создание файла с помощью любой программы означает, что будет создана жесткая ссылка – имя файла, и открыта новая область данных на диске. Причем количество ссылок на одну и ту же область данных (файл) не ограничено, т. е. у файла может быть несколько имен. Пользователь Unix может добавить файлу еще одно имя (создать еще одну жесткую ссылку на файл) при помощи команды ln (от англ. link - соединять, связывать). Первый параметр этой команды – это имя файла, на который нужно создать ссылку, второй – имя новой ссылки. По умолчанию ссылка будет создана в текущем каталоге. Пример создания жесткой ссылки с именем hard_link в текущем каталоге на файл /home/peter/docs/1.doc:
ln /home/peter/docs/1.doc hard_link
При создании жестких ссылок у файлов и ссылок на них совпадают размер и время создания. Также, и файлу, и ссылке на него соответствует один индексный дескриптор. Все операции с файловой системой – создание, удаление и перемещение файлов – производятся на самом деле над индексными дескрипторами, а имена нужны только для того, чтобы пользователь мог легко ориентироваться в файловой системе. Более того, имя (или имена) файла в его индексном дескрипторе не указаны. При этом жесткая ссылка представляет собой запись вида имя файла + номер индексного дескриптора в каталоге. По сути, жесткая ссылка задает еще одно имя для файла. Доступ к одному и тому же файлу при помощи нескольких имен может понадобиться в следующих случаях: 1) Одна и та же программа известна под несколькими именами. 2) Доступ пользователей к некоторым каталогам в системе может быть ограничен из соображений безопасности. Однако если все же нужно организовать доступ пользователей к файлу, который находится в таком каталоге, можно создать жесткую ссылку на этот файл в другом каталоге. 3) Современные файловые системы даже на домашних персональных компьютерах могут насчитывать до нескольких десятков тысяч файлов и тысячи каталогов. Обычно у таких файловых систем сложная многоуровневая иерархическая организация - в результате пути ко многим файлам становятся очень длинными. Чтобы организовать более удобный доступ к файлу, который находится очень «глубоко» в иерархии каталогов, также можно использовать жесткую ссылку в более доступном каталоге. 4) Полное имя некоторых программ может быть весьма длинным (например, i586-alt-linux-gcc-3.3), к таким программам удобнее обращаться при помощи сокращенного имени (жесткой ссылки) - gcc-3.3.
Символические (мягкие) ссылки У жестких ссылок есть два существенных ограничения: 1) Жесткая ссылка может указывать только на файл, но не на каталог, потому что в противном случае в файловой системе могут возникнуть циклы – бесконечные пути. 2) Невозможно создать на жестком диске жесткую ссылку на файл, расположенный на съемном ностиеле. Чтобы избежать этих ограничений, были разработаны символические (их еще называют символьными) ссылки. Символьная ссылка (symbolic link) – это просто файл особого типа, в котором содержится имя другого файла. Символьные ссылки, как и жесткие, предоставляют возможность обращаться к одному и тому же файлу по разным именам. Кроме того, символьные ссылки могут указывать и на каталог, чего не позволяют жесткие ссылки. Символьные ссылки называются так потому, что содержат символы – путь к файлу или каталогу. Если на пути к файлу встречается символьная ссылка, система выполняет подстановку: исходный путь заменяется тем, что содержится в ссылке. Символьную ссылку можно создать при помощи команды lnс ключом –s. Пример создания символьной ссылки с именем olga_file в домашнем каталоге пользователя andrew на файл mylist.lst, который находится в каталоге lists в в домашнем каталоге пользователяolga:
ln –s /home/olga/lists/mylist.lst /home/andrew/olga_file
Номер индексного дескриптора, размер и время создания файла и символической ссылки на него различаются. Это свидетельствует о том, что сам файл и символическая ссылка – это разные файлы. Символьная ссылка вполне может содержать имя несуществующего файла. В этом случае ссылка будет существовать, но не будет работать.
Удаление файлов и каталогов Для удаления файлов предназначена команда rm (от англ. remove - удалять). Она предназначена для удаления жестких ссылок, а не самих файлов. В Unix, чтобы полностью удалить файл, требуется последовательно удалить все жесткие ссылки на него. При этом все жесткие ссылки на файл (его имена) равноправны – среди них нет «главной», с исчезновением которой исчезнет файл. Пока есть хоть одна ссылка, файл продолжает существовать. Впрочем, у большинства файлов в Unix есть только одно имя (одна жесткая ссылка на файл), поэтому команда rm имя_файла/список_имен_файлов в большинстве случаев успешно удаляет файл. Например, команда
rm test
приведет к удалению файла test. А команда
rm *.txt
приведет к удалению всех файлов с расширениями txt. Некоторые флаги команды rm:
Для удаления каталогов предназначена другая команда – rmdir (от англ. remove directory – удалить каталог). Впрочем, rmdir согласится удалить каталог только в том случае, если он пуст: в нем нет никаких файлов и подкаталогов. Удалить каталог вместе со всем его содержимым можно командой rm с ключом -r (--recursive). Команда
rm -r имя_каталога
является очень удобным способом потерять в одночасье все файлы: она рекурсивно обходит весь каталог, удаляя все, что попадется: файлы, подкаталоги, символьные ссылки. А ключ -f (--force) делает ее работу еще неотвратимее, так как подавляет запросы вида «удалить защищенный от записи файл», так что rm работает безмолвно и безостановочно. Помните: если вы удалили файл, значит, он уже не нужен, и не подлежит восстановлению! Некоторые флаги команды rmdir:
Примеры:
Просмотр содержимого файлов Вывод содержимого файла осуществляется несколькими способами. Рассмотрим каждый их них в отдельности.
1. Команда more имя_файла/список_имен_файлов выводит на экран содержимое одного или нескольких указанных файлов, при этом нет необходимости запускать текстовый редактор, распечатывать файл или нажимать клавишу паузы во время выхода текста на экран. Например, для вывода на экран содержимого файла /etc/passwd используется команда
more /etc/passwd
Недостаток этой команды в том, что невозможно пролистать информацию в обратном направлении, а только вперед (с помощью клавиш [пробел ]или [Enter]).
2. Команда less имя_файла/список_имен_файлов осуществляет вывод содержимого одного или нескольких указанных файлов на экран и позволяет просматривать его в обоих направлениях. Возврат на предыдущую страницу выполняется после нажатия клавиши [b].
3. Команда cat имя_файла/список_имен_файлов осуществляет конкатенацию (объединение) содержимого указанных файлов и вывод его на экран. Ее можно применять для просмотра содержимого небольших файлов. При попытке просмотра больших файлов, а тем более объединения их содержимое быстро промелькнет на экране. Поэтому для просмотра больших файлов лучше пользоваться командами less и more. Некоторые флаги команды cat :
Ввод и вывод Любая программа – это автомат, предназначенный для обработки данных: получая на входе одну информацию, они в результате работы выдают другую. Хотя входящая и/или выходящая информация может быть и нулевой, т. е. попросту отсутствовать. Те данные, которые передаются программе для обработки – это ее ввод, то, что она выдает в результате работы – вывод. Организация ввода и вывода для каждой программы – это задача ОС. Для того чтобы записать данные в файлили прочитать их оттуда, процессу необходимо сначала открытьэтот файл (при открытии на запись, возможно, придется предварительно создать его). При этом процесс получает дескриптор (описатель) открытого файла – уникальное для этого процесса число, которое он и будет использовать во всех операциях записи. Первый открытый файл получит дескриптор 0, второй – 1 и так далее. Закончив работу с файлом, процесс закрываетего, при этом дескриптор освобождается и может быть использован повторно. Если процесс завершается, не закрыв файлы, за него это делает система. Строго говоря, только в операции открытия дескриптора указывается, какой именно файл будет задействован. В качестве «файла» используются и обычные файлы, и файлы устройств (чаще всего – терминалы), и каналы, описанные далее. Дальнейшие операции – чтение, запись и закрытие – работают с дескриптором, как с потоком данных, а куда именно ведет этот поток, неважно. Каждый процесс Unix получает при старте три«файла», открытых для него системой. Первый из них (с дескриптором 0) открыт на чтение, это стандартный ввод процесса. Именно со стандартным вводом работают все операции чтения, если в них не указан дескриптор файла. Второй «файл» (с дескриптором 1) открыт на запись, это стандартный вывод процесса. С ним работают все операции записи, если дескриптор файла не указан в них явно. Наконец, третий поток данных (с дескриптором 2) предназначается для вывода диагностических сообщений, он называется стандартный вывод ошибок. Поскольку эти три дескриптора уже открыты к моменту запуска процесса, первый файл, открытый самимпроцессом, будет, скорее всего, иметь дескриптор 3. Стандартный вывод (standard output, STDOUT) – это поток данных, открываемый системой для каждого процесса в момент его запуска и предназначенный для данных, выводимых процессом. Стандартный ввод (standard input, STDIN) – это поток данных, открываемый системой для каждого процесса в момент его запуска и предназначенный для ввода данных. Стандартный вывод ошибок (standard error, STDERR) – это поток данных, открываемый системой для каждого процесса в момент его запуска и предназначенный для диагностических сообщений, выводимых процессом.
Перенаправление ввода и вывода В Unix стандартный ввод осуществляется с клавиатуры, стандартный вывод направлен на терминал, на него же направлен и стандартный вывод ошибок. Вместо этого можно путем переназначения записать выходную информацию любой команды в файл, ввод команде передать также из файла, и ошибки также можно записать в файл. Для этого существуют специальные операторы перенаправления ввода и вывода:
Примеры:
Перенаправление вывода ошибок Использование стандартного вывода ошибок наряду со стандартным выводом позволяет отделить собственно результат работы программы от разнообразной сопровождающей информации, например, направив их в разные файлы. Стандартный вывод ошибок может быть перенаправлен так же, как и стандартный ввод/вывод, для этого используется комбинация символов «2>» или «2>>» . Например, при выполнении команды
cat info 2>>cat.err
в случае, если файл info не существует, ошибка не будет выдана на экран, а допишется в файл cat.err. Иногда, однако, требуется объединить стандартный вывод и стандартный вывод ошибок в одном файле, а не разделять их. В командной оболочке bash для этого имеется специальная последовательность «2>&1». Это означает «направить стандартный вывод ошибок туда же, куда и стандартный вывод»:
cat info >info_file 2>>&1
В данном примере сначала указано, куда перенаправить стандартный вывод (>info_file) и только потом указано направить туда же стандартный вывод ошибок (2>>&1). Если бы было указано перенаправление потока ошибок перед перенаправлением вывода (2>&1 > info_file), в файл попал бы только стандартный вывод, а диагностические сообщения появились бы на терминале. Однако логика здесь железная: на момент выполнения операции 2>&1 стандартный вывод был связан с терминалом, значит, после ее выполнения стандартный вывод ошибок тоже будет связан с терминалом. А последующее перенаправление стандартного вывода в файл, конечно, никак не отразится на стандартном выводе ошибок. Номер в конструкции &номер – это номер открытого дескриптора. Чтобы не набирать громоздкую конструкцию > файл 2>&1 в bash используются сокращения: &> файл или, что то же самое, >& файл.
Перенаправление в никуда Иногда заведомо известно, что какие-то данные, выведенные программой, не понадобятся. Например, предупреждения со стандартного вывода ошибок. В этом случае можно перенаправить стандартный вывод ошибок в файл устройства, специально предназначенный для уничтожения данных – /dev/null. Это устройство называется пустым или «мусорной корзиной». Все, что записывается в этот файл, будет просто проигнорировано:
cat info >info_file 2> /dev/null
Точно таким же образом можно избавиться и от стандартного вывода, отправив его в /dev/null.
Конвейер Нередко возникают ситуации, когда нужно обработать вывод одной программы какой-то другой программой. Пользуясь перенаправлением ввода-вывода, можно сохранить вывод одной программы в файле, а потом направить этот файл на ввод другой программе. Однако то же самое можно сделать и более эффективно: перенаправлять вывод можно не только в файл, но и непосредственнона стандартный ввод другой программе. В этом случае вместо двух команд потребуется только одна – программы передают друг другу данные «из рук в руки». В Unix такой способ передачи данных называется конвейером. Для перенаправления стандартного вывода на стандартный ввод другой программе служит символ «|». Самый простой и наиболее распространенный случай, когда требуется использовать конвейер, возникает, если вывод программы не умещается на экране монитора и очень быстро «пролетает» перед глазами, так что человек не успевает его прочитать. В этом случае можно направить вывод в программу просмотра less, которая позволит не торопясь пролистать весь текст, вернуться к началу и т. п.:
cat employers.txt | less
Можно последовательно обработать данные несколькими разными программами, перенаправляя вывод на ввод следующей программе и организуя сколь угодно длинный конвейер для обработки данных. В результате получаются очень длинные командные строки вида cmd1 | cmd2 | ... | cmdN, которые могут показаться громоздкими и неудобными, но оказываются очень полезными и эффективными при обработке большого количества информации, как мы увидим позже при рассмотрении фильтров. Организация конвейера устроена по той же схеме, что и перенаправление в файл, но с использованием особого объекта системы – канала. Если файл можно представить в виде коробки с данными, снабженной клапаном для чтения или клапаном для записи, то канал – это оба клапана, приклеенные друг к другу вообще без коробки. Для определенности между клапанами можно представить трубу, немедленно доставляющую данные от входа к выходу (английский термин pipe основан как раз на этом представлении, а в роли трубы выступает, конечно же, сама ОС Unix). Каналом пользуются сразу два процесса: один пишет туда, другой читает. Связывая две команды конвейером, командная оболочкаоткрывает канал (заводится двадескриптора – входной и выходной), подменяет по уже описанному алгоритму стандартный вывод первого процесса на входной дескриптор канала, а стандартный ввод второго процесса – на выходной дескриптор канала. После чего остается запустить по команде в этих процессах, и стандартный вывод первой попадет на стандартный ввод второй. Таким образом, канал – это неделимая пара дескрипторов (входной и выходной), связанных друг с другом таким образом, что данные, записанные во входной дескриптор, будут немедленно доступны на чтение с выходного дескриптора.
Некоторые полезные команды
echo – выводит на стандартный вывод указанную строку символов и осуществляет перевод строки. Например:
date – вызванная без параметров, выводит текущую дату/время.
who – вызванная без параметров, выводит информацию о пользователях, в данный момент зарегистрировавшихся в системе (по столбцам: имя пользователя, терминал, время регистрации, имя удаленного компьютера).
users – вызванная без параметров, выводит информацию о пользователях, в данный момент зарегистрировавшихся в системе (только их имена в строку).
hostname – вызванная без параметров, выводит информацию об имени текущего сетевого узла
uname - выводит информацию о компьютере и запущенной операционной системе. Флаги:
wc – (от англ. word count - подсчет слов). используется для подсчета числа строк, символов и слов в указанных файлах или стандартном вводе, если имя файла не задано или вместо него стоит дефис. Если указано более одного файла, выводятся их имена и значения счетчиков, а в конце вывода выводится итоговая сумма накопленных счетчиков. Флаги:
По умолчанию команда вызывается с флагами -clw. Примеры:
tee – одновременно копирует стандартный ввод на стандартный вывод и в указанные файлы. Если файлы не существуют, они создаются. Если же файл имеется, то он будет перезаписан, если только не указан флаг -а (или --append) – добавить стандартный вывод к содержимому указанных файлов. Команда tee чаще всего используется в конвейере. Она полезна тогда, когда необходимо не только послать данные далее по конвейеру, а и сохранить их копию. Примеры:
Специальные символы Некоторые символы в shell имеют специальное значение. Например, шаблонные символы «[]», «*», «?», символ доступа к значению переменной «$», символы перенаправления ввода и вывода «>» и «<», символ конвейера «|», пробел, используемый как разделитель. Иногда возникает необходимость отменить их специальное значение, например если мы хотим использовать один из этих символов в имени файла. В этом случае такое имя следует заключить в двойные кавычки. Двойные кавычки отменяют действие всех спецсимволов, кроме «$» и «!». Например, в результате выполнения команды
cp ./f* /tmp
в каталог /tmp будут скопированы все файлы из текущего каталога, имена которых начинаются на f. А при выполнении команды
cp ./”f*” /tmp
в каталог /tmp из текущего каталога будет скопирован файл с именем f*. Для отмены действия специального символа «$» строку символов необходимо заключить в одинарные кавычки. Например, пусть введена команда
var=’Hello world!’
Результатом работы команды
echo $var
будет строка «Hello world!». Результатом работы команды
echo ”$var”
также будет строка «Hello world!». А результатом работы команды
echo ‘$var’
будет строка «$var». Как уже упоминалось ранее, символ «\» ликвидирует специальное значение следующего непосредственно за ним символа. Например, в результате выполнения команды
echo \$var
на экран будет выведена строка «$var». КомментарииКомментариев пока нет Пожалуйста, авторизуйтесь, чтобы оставить комментарий. |