Перенаправление ввода и вывода

В интерфейсе командной строки есть очень полезная возможность перенаправления (переадресации) ввода и вывода (англ. термин I/O Redirection). Как мы уже заметили, многие программы выводят данные на экран. А ввод данных в терминале осуществляется с клавиатуры. С помощью специальных обозначений можно перенаправить вывод многих команд в файлы или иные устройства вывода (например, распечатать на принтере). Тоже самое и со вводом информации, вместо ввода данных с клавиатуры, для многих программ можно задать считывание символов их файла. Кроме того, можно даже вывод одной программы передать на ввод другой программе 😉

Разморозим нашу виртуальную машину и посмотрим как все это работает. В домашней директории создадим директорию test и перейдем в нее. Это позволит нам после завершения наших проб удалить весь мусор, стерев всю директорию test, как мы это сделали в позапрошлый раз.

Создание директории test и переход в нее

Стандартный вывод

Большинство программ, работающих в интерфейсе командной строки, отображают результаты, направляя их на специальное приспособление, называемое стандартным выводом. Все, что отправляется в стандартный вывод, обычно отображается на экране. Но вывод можно перенаправить. Для его перенаправления в определенный файл, существует специальное обозначение «>» (знак больше), после которого указывается имя файла. В таком случае вывод результатов работы команды записывается в файл и на экран не выводится. Если файла с указанным именем не существует, то он будет создан. В противном случае, старое содержание файла будет стерто. Для записи в конец существующего файла вместо «>» следует использовать «>>» (два знака больше). Если файл отсутствует, то он будет создан, в противном случае вывод будет дописан в конец существующего файла.

Посмотрим как это работает. Для этого перенаправим вывод команды ls в файлы. А после посмотрим их содержание с помощью программы для чтения текстовых файлов less.

Перенаправление вывода всегда указывается после всех параметров и аргументов программы (в конце команды).

Помимо текстовой информации, в стандартный вывод могут быть выведены двоичные (не читаемые человеком данные). В таком случае, при обычном вызове программы, которая выдает подобный результат, они появятся на экране, что не имеет смысла, так как прочитать (понять) результат работы программы мы не сможем 🙁 Предполагается, что подобный вывод будет перенаправлен для записи в файл или на ввод другой программе.  Это очень удобно, ведь программа лишь обрабатывает данные, а после мы сами указываем, куда отправить (или записать) результат, без необходимости предварительной записи его во временные файлы. С конкретными примерами подобного использования мы познакомимся после того, как разберемся с перенаправлением ввода.

Стандартный ввод

Большинство программ, работающих в интерфейсе командной строки, ожидают ввод данных от пользователя с так называемого приспособления стандартный ввод.  Обычно, все, что набирается на клавиатуре, доступно для считывания программе из стандартного ввода. Но его можно перенаправить.  Чтобы перенаправить ввод из файла, существует специальное обозначение «<» (знак меньше) после которого следует указать имя файла. При перенаправлении ввода, вместо того, чтобы считывать символы с клавиатуры (стандартного устройства ввода), программа считывает их их указанного источника (файла).

Чтобы понять, удобство переадресации ввода, вначале познакомимся с программой sort, которая считывает строки и выводит их, отсортировав по алфавиту. Если быть совсем честным, то программа sort умеет считывать данные из файла, если указать его имя, но мы не будем в данном случае этим пользоваться. Ведь нас интересует разобраться как работает перенаправление ввода.

Вначале запустим программу sort и введем несколько строк. После завершения ввода воспользуемся комбинацией Ctrl+D, которая вставляет так называемый символ (указатель) конца данных (файла).

Как видим, программа отсортировала строки в алфавитном порядке (вначале следуют цифры). Если присмотреться, то не очень понятно, где начинается вывод результата, так как сразу после того, как мы закончили вводить данные, программа вывела результат.

Программа sort

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

Аналогично было бы, если бы мы сортировали строки из файла. На экране был бы отображен лишь результат сортировки. Попробуем отсортировать строки в файле usr.txt, в который мы сохранили вывод результата программы ls после двух запусков. Как мы заметили, программа ls выводит результат в отсортированном виде, но мы запускали ее дважды и получили два отсортированных списка в файле usr.txt. Сейчас нам нужно отсортировать все строки файла usr.txt между собой.

Перенаправление ввода всегда указывается после всех параметров и аргументов программы (в конце команды).

Можно сразу перенаправить и ввод, и вывод. Сохраним отсортированный выше список в файле usr-sorted.txt и посмотрим результат через less.

При одновременном указании переадресации ввода и вывода, порядок в котором они указываются не имеет значения. Можно вначале указать либо перенаправление ввода, а затем вывода, либо наоборот 🙂

Перевод вывода на ввод

Перенаправлять стандартные ввод и вывод в файлы мы уже умеем. Но еще можно вывод одной команды подать на ввод другой. Это наиболее полезный и удобный функционал переадресации ввода вывода. Таким образом можно объединить в цепочку несколько команд, последовательно создавая канал между выводом одной команды и вводом следующей. Такая переадресация ввода вывода одной команды в другую называется каналом (англ. pipeline или pipe). Для присоединение ввода команды к выводу другой команды, используется обозначение «|» (вертикальная черта, «труба» (англ. pipe)). После полного описания команды, вывод которой следует перенаправить на ввод другой команде, ставится символ «|» (вертикальная черта) и следует описание второй команды. Цепочка может содержать сразу несколько команд.

Посмотрим как это работает. Если мы помним, в директории /usr/bin слишком много файлов. Мы хотим посмотреть детальную информацию по каждому, но список не помещается на экране. Для решения подобной задачи мы перенаправляли вывод команды ls в файл, а затем открывали его через удобную программу для просмотра текстовых файлов less. А ведь можно сразу без сохранения результата в файл открыть его через less. Сделаем это.

Перенаправление вывода команды ls в программу less

Теперь мы можем видеть весь результат и перемещаться по нему при помощи прокрутки в less и даже выполнять поиск текста. Для выхода из less нажмем клавишу «q». Я надеюсь, к текущему моменту мы запомнили нужные нам команды управления, особенно выход из less, поэтому далее про «q» упоминаний не будет.

Не забудем удалить созданную директорию test. Все помнят как это сделать? Если возникают сложности, советую вновь ознакомиться и понять основные методы воздействия на файлы и директории в Linux.

Более подробно о применении цепочек из команд будет рассказано в следующих материалах. А пока вновь заморозим виртуальную машину. О заморозке и разморозке в будущем я тоже упоминать не буду, как и о многом очевидном. И не бойтесь отклоняться от инструкций в материалах и ставить опыты с командной строкой — это только пойдет на пользу 🙂

Работаем с командами и программами

Мы уже сталкивались с различными командами, их параметрами и аргументами. Попробуем разобраться как все устроено.

Введенное что-либо в командной строке воспринимается как инструкция к выполнению. Она может быть как указанием к запуску другой программы, так и внутренней командой Linux Shell (мы работает с программой bash в качестве командной строки). Для нас в большинстве случаев важен лишь результат исполнения.

Команды Linux Shell можно поделить на 4 группы:

  1. Исполняемая программа. В качестве примера можно взять любой файл из директории /usr/bin. Программы могут быть представлены в виде скомпилированных двоичных файлов или текстовых скриптов. Они дают возможность расширения набора доступных возможностей (команд) при установке новых приложений или разработке собственных.
  2. Внутренняя команда Linux Shell. В самой программе, выполняющей функции Linux Shell (в нашем случае программа bash) имеется фиксированный набор своих команд. В отличии от исполняемых программ, они позволяют изменять настройки Linux Shell. Например, при помощи команды cd можно изменить рабочую директорию.
  3. Внутренние функции Shell. Это миниатюрные скрипты, включаемые в окружение внутри Linux Shell. Пока мы с ними еще не сталкивались. Подробно мы познакомимся с ними в материалах программирования и разработки скриптов для Linux Shell.
  4. Псевдонимы или алиасы. Это команды, которые можно задать на основе других доступных команд.
  5. Управляющие конструкции. Являются частью языка Shell для написания инструкций и управляют выполнением команд. Подробно мы познакомимся с ними в материалах программирования и разработки скриптов для Linux Shell.

Разморозим виртуальную машину и познакомимся с командами поближе 🙂

Определение типа команд

Если мы знаем только имя команды, но не знаем с чем столкнулись и нам любопытно узнать, то можно воспользоваться командой type, которая определит тип интересуемой нас команды. Для этого после команды type указывается имена интересуемых команд. Сама команда type является внутренней командой Linux Shell (программы bash). Убедимся в этом.

Попробуем опытным путем получить информацию по ранее известным нам командам cd, pwd, ls, less, file, mkdir, rmdircp, mv, rm и kshkqskskjskafege (первая команда, которую мы ввели).

Как мы видим, команды cd и pwd, встроенные в Shell, less, file, mkdir, rmdircp, mv и rm — исполняемые программы из директории /usr/binls — псевдоним команды ls с ключом --color=auto (теперь мы знаем, почему папки выводятся синим цветом, а программы зеленым), а команды kshkqskskjskafege не существует.

Поиск исполняемого файла

Иногда бывает несколько разных версий выполняемой программы, установленной в разных местах. Для домашних компьютеров это несколько необычно, но на больших серверах совсем в порядке вещей. Чтобы определить точное расположение выполняемого файла по имени, существует команда which, После команды which следует указать имя интересуемой нас программы. Попробуем определить расположение программ less и rmdir.

Документация к командам

Зная название команды, можно попытаться поискать к ней документацию. Для этого есть различные инструменты.

Команда справки help

Для внутренних команд bash можно запросить справку через команду help. Для этого после команды help следует через пробел указать имя интересуемой команды, по котой требуется справка. Почитаем информацию о команде pwd.

Параметр справки --help

Многие программы поддерживают ключ --help. При его использовании, программа выводит описание, доступные параметры и ожидаемые аргументы. Запросим справку у команды mkdir.

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

Страницы руководства

Большинство программ, предназначенных для работы с интерфейсом командной строки, снабжены формальной документацией, называемой руководством по использованию. Для её поиска и просмотра в Linux присутствует специальная программа man. Чтобы получить информацию по интересуемой нас программе или файлу, после команды man следует указать имя команды или файла. Для отображения самой документации программа man запускает инструмент просмотра файлов (обычно это знакомая нам программа less). Почитаем руководство по использованию команды rmdir (для выхода из less после окончания чтения нажмем на клавиатуре клавишу «q»).

Руководство по использованию команды rmdir

Теперь мы знаем где искать информацию по незнакомым и знакомым командам 🙂

А пока вновь заморозим виртуальную машину и дадим ей отдохнуть немножко.

Воздействие на файлы и директории

В позапрошлом материале мы научились считывать содержание директорий и файлов. Теперь настало время оказывать воздействие на них 🙂

Сегодня пора познакомиться с такими не менее важными операциями копирование, перемещение, переименование и удаление файлов и директорий, создание новых директорий. Данные операции являются основными.

Если быть совсем откровенным, то некоторые из этих задач проще выполнить при помощи файлового менеджера в графическом интерфейсе. Например, перемещение и копирование файла или директории выполняются простым перетаскиванием значка из одной области (директории) в другую. Тогда возникает вопрос, а в чем необходимость напрягаться с командной строкой? Разумеется, в огромном потенциале и гибкости.

С помощью графического интерфейса действительно проще выполнять простые операции с файлами. Но, как только нужно выполнить что-либо чуть сложнее, на помощь приходит Linux Shell 😉 Например, нам необходимо скопировать все фотографии из одной директории (с фотоаппарата) в другую, но только те, которых там нет (только те, что еще не скачали на компьютер). А если копируемый файл уже присутствует в директории, куда мы пытаемся его скопировать, но его нужно заменить, но лишь при условии, что копируемый файл наиболее свежий (например, заменить оригинал на ретушь, но не наоборот). Слишком сложно в графическом интерфейсе. Слишком просто в командной строке.

Разморозим виртуальную машину. Очень важно помимо чтения данного материала испытывать его в действии. А еще лучше, пытаться ставить опыты изменяя имена файлов или директории. Так можно будет быстрее заложить базовые команды в память рук, освободив головной мозг для более сложных задач. Достаточно вспомнить любую пешую прогулку. Мы можем о чем-то задумываться, продумывать путь, но никак не думаем о движении своих ног 🙂

Подстановки

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

*
Соответствует любой подстроке символов, включая пустой строке.
?
Соответствует любому символу. Присутствие символа обязательно (не соответствует пустой строке).
[символы]
Соответствует любому символу из указанного набора символы. Набор символов может быть обозначен классом символов POSIX: [:alnum:] — любая буква или цифра, [:alpha:] — любая буква, [:digit:] — любая цифра, [:upper:] — любая буква в верхнем регистре, [:lower:] — любая буква в нижнем регистре.
[!символы]
Соответствует любому символу, который отсутствует в указанном наборе символы.

При помощи подстановок можно составить очень сложные критерии выборки файлов. Рассмотрим несколько примеров.

  • * — любые файлы
  • g* — файлы, имена которых начинаются с символа «g»
  • b*.txt — файлы с именами, начинающимися с символа «b» и заканчивающимися последовательностью символов «.txt»
  • Data??? — файлы, имя которых начинается со строки «Data» после которой следует ровно три любых символа
  • [abc]* — файлы с именами, начинающимися с одного из символов «a», «b» или «c», за которым могут следовать любые символы (также под выборку попадают имена файлов «a», «b» и «c»)
  • [[:upper:]]* — все файлы с именами, которые начинаются с буквы в верхнем регистре
  • BACKUP.[[:digit:]][[:digit:]] — файлы, имена которых начинаются со строки «BACKUP.» и заканчиваются двумя любыми цифрами
  • *[![:lower:]] — любые файлы, имена которых не заканчивается буквой в нижнем регистре.

Подстановку можно использовать почти с любыми командами, которые принимают в качестве аргументов имя файла.

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

Создание директории

Для создания новой директории можно воспользоваться командой mkdir. После имени команды через пробел нужно указать имена создаваемых директорий (для создания в рабочей директории) или пути к ним. Попробуем создать директорию test и перейдем в нее.

Отлично, мы только что создали директорию и перешли в нее. Как мы видим в ней пока нет ни файлов, ни директорий 🙁

С помощью графического интерфейса создавать директорию тоже достаточно просто. Я уверен, большинство читателей уже делали это не раз (возможно в других операционных системах, например в Windows создавали свои папки). Но, в отличии от графических файловых менеджеров, команда mkdir умеет гораздо больше чем создание одной директории за раз. Попробуем за раз создать несколько директорий, указав их имена через пробел.

Мы создали сразу пять директорий dir1, dir2, dir3, dir4 и dir5, а команду ввели всего один раз. В графическом файловом менеджере для создания каждой директории нам потребовалось бы выполнять весь процесс создания для каждой директории, это куча движений мыши и нажатий на кнопки.

Но и это еще не все. На может потребоваться создать директорию в директории, которой еще не существует. Например, мы хотим отсортировать фото по годам, месяцам и дням). Для этого нужно сначала создать родительскую директорию (photo), в ней еще одну директорию (год), в ней еще одну (месяц) и в ней еще одну (день). Но только не с mkdir! При использовании команды mkdir можно передать параметр -p, с которым будут созданы все несуществующие промежуточные директории. Попробуем сделать это.

Отлично. Мы создали директорию photo, внутри которой две директории 2010 и 2014, в директории 2010 создана директория 12 с пустой поддиректорией 05, а внутри 2014 директория  01 с пустой поддиректорией 10. Это все при помощи одной команды, всего лишь указав желаемые пути для наших директорий 10 и 05. Родительские директории photo, photo/2010photo/2014photo/2014/01, photo/2010/12 были созданы автоматически.

Безопасное удаление директории

Безопасно удалить пустую директорию можно с помощью команды rmdir. После имени команды через пробел нужно указать имена создаваемых директорий (для создания в рабочей директории) или пути к ним. Возможно использовать подстановки.

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

Настало время выбросить что-то ненужное. Попробуем избавиться от директории dir1.

Как видно, директории dir1 больше нет. Теперь попробуем таким же способом стереть директорию photo.

Не получилось 🙁 Мы получили сообщение об ошибке выполнения операции. В нем говорится, что наша директория photo не пустая. Если мы помним, в ней у нас есть две директории 2010 и 2014.

А вот директории dir2, dir3, dir4 и dir5 у нас пустые и нам больше не нужны. Попробуем их удалить. Можно удалять по одной или сразу перечислить их мена через пробел. Но есть кое-что проще — подстановки шаблонов имени. Если присмотреться внимательнее к именам директорий dir2, dir3, dir4 и dir5, то можно заменить, все они начинаются «dir». Как мы уже видели при помощи команды ls ранее, других файлов и директорий с именами, начинающимися с «dir» нет. Поэтому нам подойдет шаблон «dir*», выборка по которому затронет только директории dir2, dir3, dir4 и dir5. А использую команду rmdir мы можем не беспокоится о последствиях. Ведь она проверяет, чтобы удаляемый объект был обязательно директорией и обязательно пустой. Команда rmdir не позволит нам удалить какую-либо информацию. Удалим директории dir2, dir3, dir4 и dir5.

Отлично, теперь мы умеем безопасно удалять пустые директории 🙂

Команда rmdir

Копирование файлов и директорий

Для копирования файлов и директорий в Linux существует программа cp. В своей простой форме она копирует один файл, создавая его копию с другим именем.

Помимо этого, команда cp умеет копировать сразу множество файлов и директорий в другую директорию (сохраняя при этом имена файлов).

Попробуем что-то скопировать. Мы уже находимся в директории test, в которой у нас создана директория photo, но совсем нет файлов 🙁 Пора бы это исправить. Скопируем файл /etc/prelink.conf сохранив копию под именем test.txt в рабочую директорию.

У нас появилась копия файла /etc/prelink.conf. Попробуем скопировать файл /etc/hosts в рабочую директорию. Копию тоже назовем test.txt (такой файл уже существует).

Как видно, программа не выдала сообщения об ошибке, но нового файла у нас не появилось. Мы перезаписали старый файл test.txt содержанием файла /etc/hosts, безвозвратно стерев старое содержание файла. Так ведь легко потерять и очень важную информацию 🙁

К счастью, у программы cp существует ключ -i. При его использовании, перед заменой существующего файла программа спросит разрешение на перезапись содержания. Чтобы согласиться нужно ввести ответ «y» (после символа «y» могут следовать любые символы) и нажать Enter. Для отказа следуют ввести «n» (или любую строку, не начинающуюся с «y») и нажать Enter. Попробуем снова создать копию файла /etc/prelink.conf под именем test.txt с использованием параметра -i.

Как видим, на этот раз перед заменой содержания файла text.txt программа cp спросила на это разрешение.

Если мы заранее знаем, что не хотим заменять содержание существующего файла, можно воспользоваться параметром -n. При его использовании, существующие файлы при копировании заменены не будут.

Попробуем снова скопировать файл /etc/hosts в рабочую директорию. Копию тоже назовем test.txt (такой файл уже существует), но в этот раз используем ключ -n.

Как видно, программа не выдала сообщение об ошибке. Но содержание файла заменено не было. Мы можем в этом легко убедиться. Для этого по очереди с помощью программы less ознакомимся с содержанием файлов text.txt и /etc/hosts. Видим разницу? Значит мы ничего не заменили и не стерли 🙂

Еще при помощи команды cp можно копировать файлы в директории сохраняя имена файлы (имя копии внутри директории будет соответствовать имени копируемого файла) — это удобно при копировании сразу нескольких файлов.

Для начала создадим две директории dir1, dir2 и dir3.

Теперь скопируем файл test.txt в директорию dir1.

Мы указали, что хотим скопировать файл test.txt и сохранить копию в dir1. Именно такой результат мы и получили. Так как мы указали как место сохранения копии существующую директорию, то копия была помещена в нее с исходным именем файла.

Теперь скопируем файл test.txt в test2.

Как видим, мы получили новый файл test2 с копией содержимого файла test.txt. Если мы указываем как место сохранения копии имя существующего файла, либо не существующее имя, то копия содержимого сохраняется в файл с указанным именем (если он не существует, то будет создан).

При копировании файла в директорию можно ошибиться в имени директории и тогда, вместо желаемого результата мы получим еще один файл с указанным «ошибочным» именем. Ошибку легко избежать, если после имени директории поставить символ «/» (слэш).

Как видим файл test2 был успешно скопирован в директорию dir1, а при попытке копирования в несуществующую директорию dir9 мы получили сообщение об ошибке, без создания ненужного файла dir9.

С помощью программы cp можно копироваться сразу несколько файлов в директорию, указывая их имена через пробел, либо использую подстановки.

А еще программа cp умеет копировать директории и их содержимое. Для этого существует ключ -R, который указывает на необходимость копирования содержимого.

Как видим, мы успешно скопировали директорию dir1 внутрь директории dir2. По аналогии с файлами, можно скопировать директорию создав копию под другим именем.

Теперь у нас есть файлы и директории с файлами, а значит есть что переименовывать, перемещать и удалять 🙂

Команда cp

Переименование и перемещение

Программа mv выполняет переименование и перемещение файлов и директорий. В отличии от копирования, при котором сохраняются и сами исходные объекты, и их копии, при перемещении или переименовании исходные файлы и директории не сохраняются. Использование команды mv схоже с использованием команды cp. У команды mv отсутствует ключ -R, так как при переименовании или перемещении директории, содержимое остается в ней (нет необходимости указывать отдельно на необходимость его копирования).

Переименуем файл test2 в test2.txt.

Создадим директорию dir5 и переместим в нее файлы test.txt и test.txt.

Переименуем директорию dir5 в test.

Теперь переместим директории dir1, dir2, dir3 и dir4 в директорию test. Чтобы не перечислять все директории списком, можно воспользоваться подстановкой по шаблону.

Из директории test переместим файлы test и test2.txt обратно в рабочую директорию. Для простоты воспользуемся подстановкой, а на рабочую директорию сошлемся с использованием специального обозначения «.» (точка).

Отлично, файлы возвращены в рабочую директорию и теперь у нас есть что удалять 🙂

Команда mv

Удаление файлов и директорий

Мы уже умеем безопасно удалять пустые директории без потери данных при помощи программы rmdir. Но бывает необходимость уничтожать данные (удалять файлы). Для удаления файлов есть программа rm. После имени команды следует указать список удаляемых файлов через пробел. Возможно использование подстановки имени файла по шаблону.

Удалим файл test2.txt.

Файл был удален. Следует с осторожностью использовать программу rm. Данные удаляются без возможности восстановления. Особенно легко ошибиться и удалить что-то нужное при использовании подстановок. При помощи ключа -i перед удалением каждого объекта будет запрошено подтверждение. Чтобы согласиться нужно ввести ответ «y» (после символа «y» могут следовать любые символы) и нажать Enter. Для отказа следуют ввести «n» (или любую строку, не начинающуюся с «y») и нажать Enter. Попытаемся удалить файл test.txt, но после запроса подтверждения откажемся от удаления.

Для удаления директории следует использовать ключ -r. При передаче параметра -r программа rm вначале удаляет все файлы и директории (включая вложенные) внутри удаляемой директории, после чего саму директорию. Удалим директорию photo.

Теперь попробуем удалить что-либо с использованием подстановок. Чтобы обезопасить себя и предварительно узнать какие файлы пройдут выборку по шаблону, воспользуемся следующим трюком. Вместо команды rm воспользуемся командой ls, передав ей в качестве аргумента нашу подстановку. Таким образом будут перечислены все выбранные объекты по шаблону. Если результат нас устроит, то можно смело удалять программой rm.

Вернемся в родительскую директорию, которая является домашней, и удалим освободившуюся директорию test. Без ключа -r команда rm выдаст предупреждение при попытке удалить директорию и не удалит ее. Для удаления пустых директорий всегда следует пользоваться программой rmdir вместо ключа -r программы rm. Это позволит сохранить данные в целости и сохранности 🙂

Лишнее убрано. Теперь заморозим виртуальную машину.

Команда rm

Путешествие по Linux

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

Результат работы программы file

Настало время отправится на экскурсию. Ниже описаны интересные места, которые нужно посетить. На этот раз конкретных команд и результатов их выполнения опубликовано не будет, попробуйте побродить по описанным местам свободно 😉

В путешествии по указанным местам могут помочь следующие инструменты:

  •  с помощью команды cd нужно посетить каждое указанное место, а также рекомендуется побродить по вложенным директориям
  • команда ls поможет узнать содержимое посещаемых мест
  • если какой-то файл показался интересным, то при помощи инструмента file можно получить краткие сведения о его формате
  • просмотреть текстовые файлы поможет программа less

Список мест для посещения

/
Корневая директория — начало файловой структуры Linux. На большинстве Linux систем содержит в основном директории, но может содержать и файлы.
/boot
Место, где расположены ядро Linux и загрузчик операционной системы. Файл ядра называется vmlinuz.
/etc
Директория, в которой находятся конфигурационные файлы системы. Все они должны быть текстового формата. В файле /etc/passwd хранится важная информация об учетных записях пользователей в Linux. Он определяет учетные записи пользователей. Файл /etc/fstab содержит таблицу дисковых устройств, которые подключаются в момент загрузки операционной системы. Он определяет дисковые устройства. В файле /etc/hosts записаны сетевые имена и их IP-адреса, которые заведомо известны. Директория /etc/init.d содержит загрузочные скрипты различных служб, которые обычно запускаются во время загрузке системы.
/bin и /usr/bin
В этих директориях расположено большинство установленных программ. В директории /bin находятся необходимые для работы системы инструменты. А в директории /usr/bin расположены установленные приложения для пользователей системы.
/sbin и /usr/sbin
Директории sbin содержат программы для системного администрирования, которые обычно используются суперпользователем root.
/usr
В этой директории хранятся различные принадлежности для пользовательских приложений. В /usr/share/X11 расположены файлы для графической оболочки X Windows. Директория /usr/share/dict содержит словари для программ проверки правописания. В /usr/share/doc расположена различная документация в различных форматах. А страницы руководства хранятся в /usr/share/man. Файлы исходного кода программ можно найти в директории /usr/src. Если установлен пакет исходного кода ядра, то тут можно найти полный исходный код ядра операционной системы Linux.
/usr/local
В этой директории и вложенных директориях расположены установленное программное обеспечение и прочие файлы для использования на компьютере. Программное обеспечение, которое не является частью официального дистрибутива Linux, обычно хранится здесь.
/var
Здесь хранятся файлы, которые изменяются в процессе работы системы. В директории /var/log расположены журнальные файлы. Они обновляются в процессе работы операционной системы и программ. Необходимо время от времени просматривать содержимое данных файлов для отслеживания состояния системы.  А директория /var/spool используется для организации очередей, таких как почтовые отправления или задания на печать. Когда почта пользователя изначально приходит на компьютер (предполагается, что он используется как почтовая служба), сообщения попадают в директорию /var/spool/mail.
/lib
Директория содержит общие библиотеки (аналог DLL файлов в Windows) для программного обеспечения на компьютере.
/home
Здесь обычно расположены домашние директории пользователей. Место, где они сохраняют результаты своей работы. В основном, это единственное место, куда пользователи могут сохранять свои файлы. А значит компьютер находится всегда в чистоте и порядке 🙂
/root
Домашняя директория для суперпользователя root.
/tmp
Место, в котором программы могут размещать свои временные файлы.
/dev
Это особая директория, которая не содержит реальных файлов. В место этого, в ней находятся устройства, доступные для операционной системы. В Linux каждому устройству соответствует специальный файл. Это позволяет производить обмен информацией с устройством как обычные операции чтения и записи файла. Например, /dev/df0 это первый дисковод (кто-то еще помнит дискеты? ;)), а /dev/sda (или /dev/hda на старом железе) — первый жесткий диск. Все устройства, которые распознает ядро операционной системы расположены в директории /dev.
/proc
Эта директория тоже особенная. В ней нет реальных файлов и ее вообще не существует на диске. Она полностью виртуальна. Директория /proc является содержит скважины в глубь ядра операционной системы. Группа из директорий с числами внутри директории /proc содержат информацию о процессах системы. Каждому запущенному процессу соответствует своя директория с номером. Помимо информации о процессах, в директории /proc еще имеются объекты с текстовыми именами, которые дают доступ к текущей конфигурации системы. Много из них можно посмотреть через программу less. Рекомендую открыть /proc/cpuinfo. В нем содержится информация доступная ядру о процессоре.
/media и /mnt
Директории /media и /mnt тоже особые, но в отличии от /dev и /proc, они и их содержимое реальны. Это обычные директории, которые используются в специальных целях. Директория /media применяется в качестве точек монтирования. Как нам уже известно, различные устройства хранения информации (например, жесткие диски) подключаются к файловой структуре в виде поддеревьев в различных директориях. Процесс подключения устройства к директории называется монтированием. Для доступа к устройству, его необходимо монтировать к файловой структуре. В процессе загрузки системы, она считывает инструкции по монтированию из файла /etc/fstab, содержащим информацию о точках монтирования устройств в дереве директорий. Этот процесс подключает только постоянные жесткие диски, но помимо них, можно также подключать временные устройства, такие как CD-ROM, внешние жесткие диски и т.д. Так как они съемные, они не остаются смонтированными постоянно. Директория /media используется в качестве точки монтирования для автоматических механизмов монтирования в современных дистрибутивов Linux для настольных компьютеров и ноутбуков. А в системах, требующих ручного подключения съемных устройств, удобно использовать директорию /mnt в качестве места для их монтирования. Чтобы посмотреть какие устройства к каким директориям подключены, можно воспользоваться инструментом mount.

Наше сегодняшнее путешествие завершилось, поэтому заморозим нашу виртуальную машину и оставим её до следующего раза. Свои впечатления можно написать в комментариях к этой записи 😉

Обзор содержимого директорий и файлов

Перемещаться по директориям в файловой системе мы уже умеем очень неплохо. А вот просматривать их содержимое научимся прямо сейчас. Для начала разморозим виртуальную машину 🙂

cd и pwd

Команда ls

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

Команда ls предназначена для перечисления содержимого в директории. Это наиболее часто используемая команда в Linux. Есть множество способов ее применения. Рассмотрим наиболее популярные на примерах.

ls

Выводит список файлов и директорий в рабочей директории без отображения скрытых объектов (у которых имя начинается с символа «.» (точка)).

ls /bin

Перечисление содержимого в директории /bin. Вместо /bin можно указать любую другую директорию через абсолютный или относительный путь к ней.

ls -l

Перечисление содержимого рабочей директории с выводом подробной информации о перечисляемых объектах.

ls -l /var /etc

Перечисление содержимого директорий /var и /etc с выводом подробной информации о перечисляемых объектах.

Содержимое каждой директории будет выведено отдельно, в начале каждой группы будет указана директория для которой выполняется перечисление его содержимого.

Таким образом можно одной командой получить информацию сразу по всем интересуемым директориям 😉

ls -la ..

Перечисление всех объектов (включая скрытых) в родительской директории с выводом подробной информаций о каждом из них.

Формат команд

Как видно из приведенных примеров, команда ls имеет определенный формат вызова. В Linux большинство команд имеют сходный формат вызова. Он следующий

команда -параметры аргументы

Где команда — имя команды или исполняемой программы, параметры — одна или несколько детальных настроек выполнения, аргументы — одна или несколько «вещей» которые должна обработать команда или программа.

На примере команды ls:

  • ls — имя команды
  • -l и -a — параметры (допускается объединение в -la при использовании обоих). Параметр -l указывает о необходимости вывода подробной информации, а -a о включении скрытых объектов. У параметра может быть указан его аргумент (в данном примере отсутствует), в таком случае при объединении аргумент применяется к последнему параметру. Если параметр не требует указания аргумента, то такой параметр называется ключом.
  • /var и /etc — аргументы, в данном случае список директорий, содержание информации которых нас интересует

Детальный вывод

При использовании параметра -l команды ls выводится подробная информация о содержимых объектах директории. Ознакомимся с её форматом более детально.

детальный вывод ls

Имя файла
Имя файла или директории.
Время изменения
Последнее время изменения файла. Если изменение произошло спустя более шести месяцев, то выводятся дата и год, иначе дата и время дня. То есть, вначале всегда выводится дата, которая состоит из месяца и числа, а после нее год или время в часах и минутах. Когда мы видим время, это значит файл был изменен за прошедшие шесть месяцев, т.е. в текущем или прошлом году 🙂
Размер
Размер файла в байтах. Для директории указывается размер метаданных (информации об объектах, которые содержатся внутри, включая их имена), а не суммарный размер содержимого. Изначально размер директории равен размеру кластера (обычно 4 Кб / 4096 байт), но может расти при необходимости.
Группа
Имя группы, для которой указаны права доступа.
Владелец
Имя учетной записи пользователя, который является владельцем файла.
Права доступа
Представление прав доступа к объекту. Первый символ указывает тип объекта. Символ «d» обозначает директорию, «-» — файл. Но есть и иные типы объектов в Linux. Далее идет три набора из трех символов, которые представляют права доступа. Первый символ указывает право чтения, второй записи, третий выполнения или входа. Первый набор из трех символов указывает права доступа владельца файла, второй — права группы файла, а последний указывает права доступа файла для всех остальных пользователей. Подробнее о правах доступа будет опубликован отдельный материал в будущем 😉

Программа less

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

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

Некоторые способы представления информации достаточно сложные (например, сжатые изображения, аудио- и видеозаписи). Но есть и достаточно простые. Один из самых первых появившихся и самых простых — текст в кодировке ASCII (American Standard Code for Information — американский стандартный код для обмена информации). Эта простая схема кодирования впервые была использована на устройствах телетайпа для указания зависимости печатных символов и номеров.

Большинство файлов на Linux системах сохранены в текстовом формате. Существует множество инструментов для обработки текстовых файлов. В других операционных системах текстовый формат не менее важен чем в Linux, поэтому в них тоже присуствует инструменты для работы с ними. В Windows есть достаточно известный текстовый редактор «Блокнот», позволяющий просматривать и изменять текстовые файлы.

Для запуска программы less необходимо ввести less имя_файла, где имя файла — абсолютный или относительный путь к файлу.

Введем less /etc/sestatus.conf и нажмем клавишу «Enter». Выведено содержание файла /etc/sestatus.conf.

Отображение /etc/sestatus.conf в less

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

Для выхода из программы less нажмем клавишу q на клавиатуре.

Управление программой less

После запуска less отображает на экране по одной странице текста за раз. Листать страницы можно клавишами Page Up и Page Down. Помимо них, в less есть и иные команды. С командой «q» мы уже знакомы — выход из программы. Вот несколько иных полезных команд программы less.

Page Up или b
Прокрутка на предыдущую страницу текста.
Page Down или space
Прокрутка на следующую страницу текст.
G
Прокрутка в конец файла.
1G
Прокрутка в начало файла
/строка
Поиск следующего вхождения указанной строки в файле.
n
Повторный поиск следующего вхождения.
h
Отображение справочной информации по всем командам less.
q
Выход из программы.

Команды следует вводить просто нажимая клавиши на клавиатуре. После набора команды, за исключением некоторых, где требуется указать параметр после команды (например, поиска строки), она автоматически выполняется. Там, где требуется ввод параметра, ввод команды следует завершить нажатием клавиши Enter. Команды регистрозависимы.

Программа file

Если просто бродить по файлам Linux, то перед тем как их попытаться посмотреть их содержание, было бы полезно понять данные какого типа в них записаны. С этим может помочь инструмент file. Программа file изучает содержимое файла и сообщает, что это за файл.

Использовать данный инструмент очень просто. Для этого после file следует указать относительный или абсолютный путь к файлу, который нас интересует. Попробуем получить информацию по файлам /bin/bash и /etc/sestatus.conf.

Теперь мы знаем, файл /bin/bash является 32-битной программой Linux, а /etc/sestatus.conf обычный текстовый файл, а значит его можно посмотреть при помощи less 🙂

Результат работы программы file

Программа file может распознавать различные типы содержимого.

Может показаться, что у большинства файлов нельзя увидеть текстовое содержимое (открыть через less можно все файлы, но не все они будут читаемы глазом). На самом очень много файлов в Linux текстовые. Особенно важные конфигурационные файлы почти всегда хранятся в текстовом легко понятном человеку формате. Также можно заметить, что большинство возможностей операционной системы реализованы через shell-скрипты, в которых программа написана открытым читаемым текстом. Ведь в Linux нет секретов 🙂

А теперь настало время вновь заморозить виртуальную машину.