Операционная система Linux Лекция №3 Текстовые файлы и потоки ● ● Процесс взаимодействия с пользователем выполняется в терминах записи и чтения в файл. То есть вывод на экран представляется как запись в файл, а ввод — как чтение файла. Файл, из которого осуществляется чтение, называется стандартным потоком ввода, а в который осуществляется запись — стандартным потоком вывода. Стандартные потоки привязаны к файловым дескрипторам с номерами 0, 1 и 2. ● Стандартный поток ввода (stdin) — 0; ● Стандартный поток вывода (stdout) — 1; ● Стандартный поток ошибок (stderr) — 2. 2 3 Каналы ● Стандартные потоки можно перенаправлять не только в файлы, но и на вход других программ. Если поток вывода одной программы соединить с потоком ввода другой программы, получится конструкция, называемая каналом, конвейером или пайпом (от англ. pipe, труба). 4 Программы фильтры ● В UNIX/Linux существует целый класс команд, которые принимают данные со стандартного потока ввода, каким-то образом обрабатывают их, и выдают результат на стандартный поток вывода. Такие программы называются программами-фильтрами. man, - -help - информация! ● ● ● ● ● ● ● cat, head, tail — см. первую лекцию cut — вырезает столбец (по символам или полям) из потока ввода и передаёт на поток вывода. sort — отсортировать данные в соответствии с какими-либо критериями, например, арифметически по второму столбцу. uniq — удалить повторяющиеся строки. Или (с ключом -с) не просто удалить, а написать сколько таких строк было. bc — вычислить каждую отдельную строку потока и записать вместо неё результат вычисления. strings — вычленить и показать в стандартном потоке (или файле) то, что напоминает строки. 5 wc — считает количество символов, слов и строк в файле или стандартном потоке ввода ● ● ● ● ● ● du -s /home/student/* | sort -nr | head -1 Вывести название и размер пользовательского каталога, занимающего наибольшее место на диске. Программа du, при вызове ее с ключом -s, сообщает суммарный объем каждого каталога или файла, перечисленного в ее параметрах. Ключ -n команды sort означает, что сортировка должна быть арифметической, т.е. строки должны рассматриваться как числа, а не как последовательности символов (Например, 12>5 в то время как строка '12'<'5' т.к. сравнение строк производится посимвольно и '1'<'5'). Ключ -r означает изменения порядка сортировки — с возрастающего на убывающий. Команда head выводит несколько первых строк поступающего на ее вход потока, отбрасывая все остальные. Ключ -1 означает, что надо вывести только одну строку. Таким образом, список пользовательских каталогов с их суммарным объемом арифметически сортируется по убыванию, и из полученного списка берется первая строка, т.е. строка с наибольшим числом, соответствующая самому объемному каталогу. 6 Поиск файлов - команда find find опции места_поиска критерии модификаторы ● ● ● места_поиска - каталоги, в которых будет идти поиск, поиск рекурсивный (включает подкаталоги). По умолчанию поиск производится в текущем каталоге. критерии - любые атрибуты файла (имя, размер, тип, владелец, права доступа и т.д.). Но find не обеспечивает поиска по содержимому. опции и модификаторы - как искать и выводить информацию 7 Критерии поиска команды find ● -name по имени файла или по шаблону ● -type по типу файла ● -size по размеру или диапозону размеров ● -empty пустые файлы и каталоги ● -mtime по дате модификации ● -perm по правам доступа ● -user и -group Пример по принадлежности Точка . указывает на текущий каталог [student@debian ~]$ find . -name “copy*” ./copy2.txt ● Если в критерии используется шаблон подстановки, то его 8 надо заключать в двойные кавычки “” Поиск по типу ● Для поиска по типу надо задавать критерий -type тип, где тип идин из: ● b файл блочного устройства ● c файл символьного устройства ● d каталог ● f обычный файл ● p именованный канал ● s сокет ● l символическая ссылка Пример Поиск по типу и имени [student@debian ~]$ find -type d -name "t*" ./test1 ./test2 ● Если критерии поиска надо объединить по логическому условию ИЛИ, то используется -о Пример Имя начинается с t или пустые [student@debian ~]$ find -name "t*" -o -empty 9 Специальные типы файлов ● ● В ОС Linux файл представляет собой просто поток байтов. Такой подход позволяет распространить концепцию файла на физические устройства и некоторые другие объекты. Это позволяет упростить организацию данных и обмен ими, потому что аналогичным образом осуществляется запись данных в файл, передача их на физические устройства и обмен данными между процессами. Во всех этих случаях используется один и тот же подход, основанный на идее байтового потока. Поэтому наряду с обычными файлами и каталогами, файлами с точки зрения Linux являются также: ● файлы физических устройств (блочные и символьные); ● именованные каналы (named pipes); ● гнезда (sockets); ● символические ссылки (symlinks). 10 Файлы физических устройств ● ● ● ● ● В ОС Linux все подключаемые к компьютеру устройства (жесткие и съемные диски, терминал, принтер, модем и т. д.), представляются файлами. Если, например, надо вывести на экран какую-то информацию, то система производит запись в файл /dev/tty01. Физические устройства бывают двух типов: символьными (или байториентированными) и блочными (или блок-ориентированными). Различие между ними состоит в том, как производится считывание и запись информации в эти устройства. Взаимодействие с символьными устройствами производится посимвольно, в режиме потока байтов. К таким устройствам относятся, например, терминалы. На блок-ориентированных устройствах информация записывается (и, соответственно, считывается) блоками. Примером устройств этого типа являются жесткие диски. На диск невозможно записать или считать с него один байт: обмен с диском производится только блоками. Файл устройства - это не драйвер устройства. Это специальный механизм, при помощи которого программы могут общаться с драйверами устройств. Находятся в каталоге /dev, подробная иноформация ls -l /dev 11 Примеры специальных файлов /dev/console Системная консоль, т. е. монитор и клавиатура, физически подключенные к компьютеру /dev/hd Жесткие диски с IDE-интерфейсом. Устройство /dev/hda1 соответствует первому разделу на первом жестком диске (/dev/hda), т. е. на диске, подключенном как Primary Master /dev/sd Жесткие диски с SCSI-интерфейсом /dev/tty Файлы поддержки пользовательских консолей. Название сохранилось с тех пор, когда к системе UNIX подключались телетайпы в качестве терминалов. В Linux эти файлы устройств обеспечивают работу виртуальных консолей (переключаться между которыми можно с помощью <Alt>+<F1> — <Alt>+<F6>) /dev/pty Файлы поддержки псевдо-терминалов. Применяются для удаленных рабочих сессий с использованием telnet /dev/ttyS Файлы, обеспечивающие работу с последовательными портами. /dev/ttyS0 соответствует COM1 в MS-DOS, /dev/ttyS1 — COM2. Если ваша мышь подключается через последовательный порт, то /dev/mouse является символической ссылкой на соответствующий /dev/ttySN /dev/null Нулевое устройство. Все, что записывается в /dev/null, навсегда потеряно. На это устройство можно перенаправить вывод ненужных сообщений. Если /dev/null используется как устройство ввода, то оно ведет себя как файл нулевой длины 12 Именнованные каналы ● ● Еще один тип специальных файлов — именованные каналы, или буферы FIFO (First In — First Out). Файлы этого типа служат в основном для того, чтобы организовать обмен данными между разными приложениями. Канал — это очень удобное и широко применяемое средство обмена информацией между процессами. Все, что один процесс помещает в канал, другой может оттуда прочитать. Если два процесса, обменивающиеся информацией, порождены одним и тем же родительским процессом (а так чаще всего и происходит), канал может быть неименованным. В противном случае требуется создать именованный канал, что можно сделать с помощью программы mkfifo. При этом собственно файл именованного канала участвует только в инициации обмена данными. 13 Доменные гнезда (sockets) ● ● Гнезда — это соединения между процессами, которые позволяют им взаимодействовать, не подвергаясь влиянию других процессов. Вообще гнезда (и взаимодействие программ при помощи гнезд) играют очень важную роль во всех Unixсистемах, включая и Linux: они являются ключевым понятием TCP/IP и соответственно на них целиком строится Интернет. Однако с точки зрения файловой системы гнезда практически неотличимы от именованных каналов: это просто метки, позволяющие связать несколько программ. После того как связь установлена, общение программ происходит без участия файла гнезда: данные передаются ядром ОС непосредственно от одной программы к другой. Несмотря на то, что другие процессы могут видеть файлы гнезд как элементы каталога, процессы, не участвующие в данном конкретном соединении, не могут осуществлять над файлами гнезд операции чтения/записи. Среди стандартных средств, использующих гнезда — система X Window, система печати и 14 система syslog. Действия над файлами, найденными командой find ● -exec <команда> \; Выполнить команду. Обратите внимание, что после команды ставится обратный слеш и точка с запятой. ● -ok <команда> \; То же самое, что и exec, но перед обработкой очередного файла будет выводится запрос на выполнение команды. ● -print Вывод имени файла на экран (действие по умолчанию). ● -ls Выполнение команды ls -dils над текущим файлом. В выполняемых командах можно использовать параметр {} в качестве аргумента, который заменяется путем к текущему 15 найденному файлу. ● Примеры find ~ -name “file*” -print Выведет на экран список файлов домашнего каталога, начинающихся на file, знак ~ указывает на домашний каталог пользователя, двойные кавычки закрывают шаблон от интерпретации Аргументы, оболочкой. ● ● ● find . -size +50k -size -100k -ls которые ожидает команда rm Найти файлы текущего каталога с размерами от 5 до 100кБ, вывести информацию о них find /home/student -type l -exec rm -i {} \; Найти все символические ссылки ниже указанного каталога (/home/student) и удалить16их с подтверждением (y -да, n - нет). Команда xargs ● Команда xargs использует данные, передаваемые ей из стандартного потока ввода в качестве аргументов для конструирования команды. ● find . -type f -name “file*” -exec ls -li {} \; ● find . -type f -name “file*” | xargs ls -li ● Обе эти команды делают одно и то же - ищут файлы, подходящие под шаблон имени (в двойных кавычках) и выводят расширенную информацию по ним, включая номер i-node. В первом случае обработка найденных файлов производится командой find, которая вызывает команду ls. Во втором случае имена найденных файлов отправляются через конвейер команде ls. 17 Команда tar ● tar предназначена для архивации групп файлов и каталогов. Эта команда позволяет объединять группу файлов и каталогов со всеми атрибутами в единый файл, который имеет расширение «.tar». tar [-c | -x] [-z | -j] -f имя_tar_файла имена_файлов_и_каталогов ● ● ● ● ● ● Опция -c соответствует созданию архива, -x — разворачивание архива. Созданный архив можно также сжать с помощью архиваторов gzip или bzip2. Для этого применяются соответственно опции -z и -j. Здесь хорошо видна разница между понятием «архивирование», которое выполняет команда tar, и «сжатием», которое производят специализированные программы. Имя архива, который создаётся или разворачивается передаётся после параметра -f. Опция -t – просмотр содержимого архива. Создание архива etc.tar.gz (расширения архива .tar.gz надо указывать самим) каталога /etc с использованием сжатия gzip: tar -czf etc.tar.gz /etc Разворачивание архива etc.tar. gz в текущий каталог с использованием разсжатия gzip : tar -xzf etc.tar.gz 18 Задание на практику ● ● ● Выполнить команды, набранные жирным шрифтом Вывести название и размер трех подкаталогов каталога /lib, занимающих наименьшее место на диске. Найти файлы каталога /dev, которые являются файлами блочных устройств, символьных устройств, именованными каналами, сокетами. Для них ● ● ● ● вывести на экран подробную информацию; подсчитать их количество с помощью передачи по конвейеру программе wc. Подсчитать количество сокетов в каталоге /tmp. Найти все файлы своего домашнего каталога, которые были модифицированы на прошлом занятии. Создать из них сжатый gzip архив (использовать xargs). 19