Управление файлами в Linux

29 мин на чтение (32.979 символов)

Как организована структура каталогов Linux?

styled-image

Одно из самых базовых понятий для любой операционной системы - это файл. Обычно, мы подразумеваем под файлом некоторое количество информации, хранящееся в постоянном хранилище (на диске), имеющее имя. Однако, Linux построена таким образом, что практически любой объект, с которым работает операционная система является файлом. Привычные нам файлы здесь называются обычными, но кроме них еще существует несколько типов, которые Linux также называет файлами, хотя с точки зрения обывателя они воспринимаются как что-то другое. Например, любое физическое устройство имеет в операционной системе особое логическое представление в виде файла в определенной папке. Вы можете зайти в эту папку и просмотреть список устройств, зайти в конкретный файл и увидеть свойства этого устройства. Однако это не просто статическая информация, хранящиеся на диске. Это динамический объект операционной системы, на диске он не занимает никакого места, его там нет. При обращении к этому файлу происходит вызов особых функция ядра ОС. Кроме этого для Linux папки, ссылки (аналог ярлыков), даже процессы самой ОС - тоже файлы.

Это сделано для унификации доступа к различным ресурсам операционной системы. Зачем придумывать особый механизм отправки документов на печать, если можно просто записать текст в файл принтера. Такой подход может немного запутывать сначала, но довольно быстро привыкаешь, что для Linux практически любой объект - это файл. Но довольно часто приходится оговариваться, имеется в виду файл в узком смысле, обычный файл, как информация на диске с именем, или в широком смысле, как концепция операционной системы.

Понятно, что файлов в каждой отдельно взятой операционной системе может быть огромное количество. И только малая часть из этого - файлы пользователей. Кроме этого существуют служебные файлы операционной системы, конфигурационные файлы, файлы системных и прикладных программ, псевдофайлы, которые мы обсуждали ранее. Если бы файлы имели только имя, ориентироваться в этой куче было бы решительно невозможно. Для этого и нужны папки. Папки, они же директории или каталоги, служат для объединения произвольного количества файлов во множество в некоторым именем. Неудивительно, что для Linux папка - это тоже файл, его особый тип. Фактически, папка - это файл, содержащий список других файлов, которые в считаются “в этой папке”. Так что сами папки тоже можно “класть” в другие папки. Таким образом, структура файлов и папок образует иерархическую структуру- дерево файловой системы.

А что происходит с файлами и папками, которые не находятся в других папках? В Linux существует специальная корневая папка. Она обозначается прямым слешем (/). Она является вершиной этой иерархии, корнем дерева, единой точкой отсчета для всех других папок на данном компьютере. Так что любой файл находится в какой-то папке, либо в в корневой директории, либо в каком-то каталоге, который может быть в другом каталоге, и так далее, но в итоге все равно в корневой папке.

Таким образом, для того чтобы указать на какой-то конкретный файл нам недостаточно его имени, еще нужен его “адрес” - путь от корневой директории по (возможно нескольким) вложенным папкам до самого файла. Такой адрес называется “путь” к файлу. У каждого файла, который находится в операционной системе существует один и только один абсолютный путь от корневой директории. Заметьте, кстати, что конкретный файл не может находится в нескольких разных папках одновременно, то есть в двух местах сразу.

Все пути в Linux отсчитываются от корня файловой системы, обозначаемого прямым слешем /. Корень всегда один, не существует никаких букв дисков, как в Windows. Корень еще называют корневой папкой или директорией, так как именно в нем содержаться все другие папки. В пути к файлу последовательно указываются папки, которые нужно пройти, чтобы найти файл, а затем - имя самого файла. Имена папок и файла разделяются прямым слешем. Так, в пути /etc/passwd первый символ / обозначает корневой каталог, etc - имя папки в корневом каталоге, passwd - имя нужного нам файла. Обратите внимание, что в Linux не принято использовать расширения в именах файлов (но, впрочем, и не запрещено, так что ими многие пользуются).

В корневой папке обычно не хранятся обычный файлы, только папки. Причем папки корневой директории несут особую смысловую нагрузку. Например, каталог /etc/ хранит текстовые конфигурационные файлы самой операционной системы, а каталог /dev/ - те самые псевдофайлы-устройства, о которых мы уже упоминали. Этот набор стандартных папок немного меняется от дистрибутива к дистрибутиву, но основные остаются общими. Существует даже специальный стандарт - Lnux FHS (filesystem hierarchy standard), который и описывает набор и предназначение стандартных папок корневой директории.

Выводы:

  1. Для Linux практически любой объект - файл.
  2. В Linux файлы организованы привычным образом в папки и подпапки, образуя иерархическую структуру - дерево файловой системы.
  3. Корневая папка / - это единая точка отсчета для всех папок.
  4. Каждый файл имеет один и только один адрес в файловой системе - абсолютный путь к нему.
  5. Для разделения имен папок и файлов в Linux используется только прямой слеш.
  6. В Linux принята стандартная структура файлов.

Что такое относительные и абсолютные пути?

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

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

При указании путей к файлам можно пользоваться некоторыми сокращениями. Вы можете использовать два специальных имени: точку (.), означающую текущую директорию, и пару точек (..), означающую родительскую директорию текущей директории. Также вы можете использовать символ тильды (~), который означает вашу домашнюю директорию, и сочетание ~username, означающее домашнюю директорию пользователя с именем username.

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

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

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

Выводы:

  1. У каждого файла в системе есть один уникальный адрес.
  2. Следует различать абсолютные и относительные пути к файлам.
  3. Абсолютный путь отсчитывается от корня файловой системы и не зависит от того, где находится пользователь.
  4. Относительный путь отсчитывается от текущей директории пользователя.
  5. Смысл переходить по директориям как раз в том, чтобы относительные пути были короче.
  6. Лучше использовать относительные пути в программах и скриптах для переносимости.

Какие виды файлов существуют?

styled-image

Мы уже говорили раньше, что UNIX-подобные операционные системы представляют многие разные объекты, с которыми приходится работать в виде файлов. Это удобно и для операционной системы и для пользователей. Давайте кратко перечислим основные виды файлов и их зачем они нужны. Посмотреть тип файла всегда можно командой ls -l. В строке соответствующей файлу самый первый символ, один из атрибутов файла, указывает его тип.

Обратите внимание, что тип файла - это не расширение, как в Windows. Там расширение является обязательным элементом имени файла и показывает операционной системе, какой программой его нужно “открывать”, то есть обрабатывать его содержимое. Другими словами, расширение файла характеризует характер содержимого этого файла. В UNIX принята другая система. Изначально вы запускаете программы командами в терминале, то есть явно указываете название программы, которая должна запуститься и обрабатывать тот или иной файл. Поэтому расширение для операционной системы необязательно. Но с распространением графических интерфейсов, когда пользователи привыкают открывать файл щелчком мыши, практика использования расширений в именах файлов начинает распространяться и на Linux. Так почти все графические окружения поддерживают ассоциации файлов с программами через расширения, как в Windows. Кроме того, это удобно пользователю, так как глядя на имя файла он может предположить, что за информация там хранится.

Самый простой тип файла так и называется - обычный файл. Он помечается символом дефиса (-). Это именованная область данных на носителе, которая может содержать произвольную информацию. Часто чтобы не путаться этот тип файлов называется документом, хотя в Linux к обычным файлам относятся и мультимедийные, и офисные, и исполняемые файлы программ и файлы с исходным текстом программ и скриптов. Короче говоря, все, что в Windows называется файлом, в Linux - обычный файл.

Мы уже говорили, что папки в UNIX - это тоже файлы. Это второй по распространенности тип файлов - папки, директории или каталоги. Это все разные названия одного и того же. Они служат для организации файлов и упрощения навигации по файловой системе. В Linux папки - это по сути просто специальный файл, который содержит список других файлов, которые считаются “лежащими” в этой папке. Файл типа каталога помещается символом d.

Еще один тип файлов - это ссылки. Они помечаются символом l (link). Ссылки вместо пользовательских данных содержат путь к другому файлу. Именно этот файл будет открываться при обращении к ссылке. Этот механизм работает аналогично ярлыкам в Windows. Ссылки нужны для более удобной организации файлов, иногда бывает полезно иметь доступ к одному и тому же файлу из разных мест, то есть папок. Можно, конечно, файл просто скопировать, но копирование файлов расходует место на диске и при изменении одной копии вторая останется старой. Надо понимать, что при удалении или перемещении исходного файла все ссылки на него, если такие есть, перестанут работать. Такие ссылки называются битыми.

Надо сказать, что все это относится к так называемым символическим, или мягким ссылкам. Именно они работают подобно ярлыкам. Но в Linux есть и другой тип ссылок - жесткие ссылки. Жесткие ссылки работают совершенно по-другому и на другом уровне. По сути дела - это просто другое имя одного и того же файла. Любой файл имеет как минимум одну жесткую ссылку на него - это само имя файла. Но вы можете создать новую ссылку. И для операционной системы все жесткие ссылки на файл являются равноправными, в отличие от символических, где есть сам файл и ссылки на него. Даже если вы удалите файл по первоначальному имени, если на него есть еще жесткие ссылки, он проложит существовать. Файл удаляется тогда, когда перестает существовать последняя жесткая ссылка на него.

Еще один тип файлов в UNIX - это специальные файлы устройств. Их можно распознать по символу c или b в атрибутах.

Выводы:

  1. Обычные файлы содержат информацию в виде данных или программного кода.
  2. В Linux тип файла - это не расширение, они вообще не обязательны.
  3. Директории, каталоги или папки - это список файлов.
  4. Ссылки используются для удобства нахождения файла в нескольких папках одновременно.
  5. Символические ссылки - это как ярлыки в Windows.
  6. Жесткие ссылки - это два адреса одного и того же файла.
  7. Сокеты используются для взаимодействия между процессами.

Как работать со ссылками в консоли?

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

inode – это объект файловой системы, содержащий информацию о владельце/группе, которым принадлежит файл или каталог, его права доступа к нему, его размер, тип файла, timestamp-ы отражающие время модификации индексного дескриптора (ctime, changing time), время модификации содержимого файла (mtime, modification time) и время последнего доступа к файлу (atime, access time) и счётчик для учёта количества жёстких ссылок на файл. Каждый inode имеет собственный номер, который присваивается ему файловой системой в момент её создания (форматирования). По сути, inode - это уникальный численный идентификатор файла в файловой системе. Узнать inode обычному пользователю не требуется, но если интересно, можно воспользоваться опцией -i команды ls:

Inodes

Иногда может возникнуть “странная” ситуация: с одной стороны – df или du будут говорить, что свободное место на диске есть, а с другой стороны операционная система будет утверждать, что “No Space Left on Device”. Одна из вероятных причин как раз явлется полное использование пула inode, выделенных для раздела на жёстком диске, т.к. кол-во inode фиксировано и задаётся во время создания таблицы раздела. Проверить общее, занятое и доступное количество inode можно с помощью df и опции -i:

Inode availability

Создать жесткую ссылку на файл можно командой ln. синтаксис команду такой:

1
$ ln целевой_файл файл_ссылка

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

Hard link creation

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

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

Hard link deletion

Поэтому при удалении исходного файла жесткая ссылка на него никуда не девается и даже продолжает работать. Сам файл, то есть inode, удалится только тогда, когда на него будет удалена последняя жесткая ссылка. Именно для этого у каждого файла отслеживается количество жестких ссылок на него. Это число вы можете видеть в подробном выводе команды ls после прав доступа и перед ником владельца файла.

Symlink

А вот символические ссылки, symlink’и, работают именно как ярлыки Windows, то есть как указатели на файл. Создать символическую ссылку можно командой

1
$ ln -s целевой_файл файл_ссылка

В терминале символические ссылки отображаются по -другому. Во-первых, обратите внимание на тип файла. Это уже символ ‘l’ - то есть ссылка. Во-вторых, inode изначального файла и ссылки отличаются. И в-третьих после имени ссылки указывается имя файла, на который она ссылается. Причем, если удалить исходный файл, ссылка перестанет работать. Она станет так называемой “битой ссылкой”, то есть ссылкой, которая никуда не ведет. В терминале с цветовой подсветкой такие ссылки дополнительно отображаются красным цветом для привлечения внимания.

Выводы:

  1. Создание, удаление, копирование, перемещение файлов изучалось ранее.
  2. inode - это уникальный численный идентификатор файла в файловой системе.
  3. inodes могут закончиться на разделе жесткого диска, тогда вы не сможете создать файл, даже если места для него хватает.
  4. Создать жесткую ссылку на файл можно командой ln.
  5. Файл существует до тех пор, пока на него есть хотя бы одна жесткая ссылка.
  6. Создать символическую ссылку на файл можно командой ln -s.
  7. Если удалить символическую ссылку исходный файл останется нетронутым.
  8. Если удалить сам файл, то все символические ссылки на него станут недействующими.

Что такое перенаправление ввода-вывода?

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

У любого процесса в операционной системе Linux существует три стандартных текстовых потока, ассоциированных с ним. Они создаются и связываются в процессом самой операционной системой. Поэтому они называются стандартными потоками. Это все справедливо, в частности, для всех команд терминала.

Стандартный поток ввода (STDIN) при работе пользователя в терминале связывается с клавиатурой. При работе команды она может считать текст их с STDIN. в таком случае выполнение команды приостанавливается и она ждет ввода пользователем текста в терминале, в котором выполняется команда. Когда пользователь введет текст и нажмет , либо + (окончание текстового потока), введенный текст передается в команду.

Стандартный поток вывода (STDOUT) предназначен для отображения результата работы программы. Он по умолчанию связывается с терминалом, в котором она выполняется. Если программа посылает какой-то текст на свой STDOUT (в Python для этого существует оператор print, в bash - его аналог echo), пользователь видит его в терминале.

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

В процессе своей работы команда или программа может открывать дополнительные потоки, например, открыв сетевое соединение или файл на чтение или запись. Но три стандартных потока существуют всегда. Большинство стандартных программ и команд Linux устроены таким образом, что все необходимые для своей работы данные они должны считывать с STDIN, на все результаты совей работы записывать в STDOUT. Таким образом программа представляет собой такой черный ящик в одним входом и одним выходом. Это очень полезное и распространенное соглашение по проектированию текстовых программ Linux, которое позволяет их объединять.

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

  • < file — использовать файл как источник данных для стандартного потока ввода.
  • > file — направить стандартный поток вывода в файл. Если файл не существует, он будет создан, если существует — перезаписан сверху.
  • 2> file — направить стандартный поток ошибок в файл. Если файл не существует, он будет создан, если существует — перезаписан сверху.
  • >>file — направить стандартный поток вывода в файл. Если файл не существует, он будет создан, если существует — данные будут дописаны к нему в конец.
  • 2>>file — направить стандартный поток ошибок в файл. Если файл не существует, он будет создан, если существует — данные будут дописаны к нему в конец.
  • &>file или >&file — направить стандартный поток вывода и стандартный поток ошибок в файл. Другая форма записи: >file 2>&1.

Давайте рассмотрим наиболее распространенные сценарии такого перенаправления.

Возьмем для примера программу cat. Она считывает один ил несколько файлов, переданных ей как аргументы и выводит их содержимое (если файлов несколько, то она “склеит”, конкатенирует их содержимое, отсюда и название команды) на свой STDOUT. При помощи символа > после команды можно перенаправить ее STDOUT в другое место, например, в файл. Таким образом, если выполнить команду:

1
$ cat file1 file1 file1 > bigfile

то вместо вывода содержимого файлов на экран, в терминал, команда cat запишет этот текстовый поток в файл bigfile. То есть эта команда объединит содержимое нескольких файлов в один. Таким же способом можно записать в файл результат работы любой команды.

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

Аналогично работает и перенаправление из файла. Например, существует команда sort, которая сортирует строки из текстового потока по алфавиту. По умолчанию, эта команда принимает текст для сортировки из своего STDIN, но в нее можно направить файл вот так:

1
$ sort <domains.list

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

В качестве файлов при перенаправлении можно использовать и устройства. Например, в Linux существует специальное псевдоустройство /dev/null. Все, что попадает в него никуда не идет, не отображается и не сохраняется. Эта такая информационная “черная дыра”. Казалось бы, зачем? Но такое устройство может пригодиться, если нам нужно “подавить” вывод какой-то команды, то есть не отображать его на экране, не записывать в файл, просто игнорировать:

1
$ apt install -y tmux > /dev/null

Надо сказать, что операторы >, >> и < работают только, когда с одной стороны команда, а с другой - файл (или псеводустройство). но можно и объединять команды - то есть перенаправлять вывод одной команды на ввод другой. Такая операция называется конвейером (pipe) и обозначается оператором |. Например, таким образом какой-то очень длинный вывод можно подать на вход программе-пейджеру, которая отобразит его с возможностью перелистывания:

1
$ ls | less

Операции перенаправления и/или конвейеры могут комбинироваться в одной командной строке.

1
$ command <input-file >output-file
1
$ command1 | command2 | command3 >output-file

Выводы:

  1. Линуксовые команды работают с текстовым вводом и текстовым выводом.
  2. У каждого процесса есть три стандартных текстовых потока - ввод, вывод и поток ошибок.
  3. Можно перенаправить результат команды в файл при помощи > или >>.
  4. Можно направить содержимое файла на вход команде при помощи <.
  5. Объединять команды можно при помощи конвейера |.

Как работать с архивами?

При работе с файлами и папками часто возникает задача работы с архивами. Архив - это файл, который содержит в сжатом виде несколько файлов или папок. Архивы - это удобный способ хранения и обмена информацией. Существует большое количество алгоритмов архивации данных, множество программ-архиваторов и, соответственно, множество форматов архивных файлов. Пользователи Windows, больше всего знакомы с архивами .zip или .rar.

В Linux тоже существуют много программ-архиваторов, но самыми распространенными являются zip, tar и gzip. Самая простая и понятная программа, которую мы советуем новичкам - это zip. Она имеется в большинстве пользовательских дистрибутивов, проста по синтаксису, работает с самым распространенным форматом архивов.

Команда

1
$ zip archive.zip file1

сжимает файл в архив. При помощи команды zip archive.zip * можно сжать в архив всю папку.

Разархивация такого архива осуществляется командой unzip:

1
$ unzip archive.zip 

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

Кроме формата zip, пользователи Linux могут встретиться с архивами формата .tar. Обычно они имеют двойной расширение - .tar.gz или .tar.bzip2. Это архивы, созданные программой tar - классической командой Linux. Особенностью этой программы является то, что она умеет создавать и распаковывать архивы, но не умеет их сжимать. Поэтому для сжатия используются другие инструменты - программы zip, gzip или bzip2.

Если вы встретили такой архив, то его можно распаковать командой:

1
$ tar -xvf file.tar.gz

У этой команды почти всегда много опций. x означает распаковку архива, v - вывод подробной информации о процессе (необязательно), f - указание файла для распаковки.

Выводы:

  1. Команда zip archive.zip file1 сжимает файл в архив.
  2. Команда zip archive.zip * сжимает в архив все файлы из текущей директории.
  3. Команда zip -r archive.zip directory1 directory2 directory3 позволяет сделать архив из папок.
  4. Команда unzip -l file.zip показывает содержимое архива.
  5. Команда unzip file1.zip распаковывает архив.
  6. Команда unzip file1.zip -d folder/ распаковывает архив в определенную папку.
  7. Команда unzip file1.zip file извлекает файл из архива.
  8. Команда tar -xvf archive.tar распаковывает архив в текущую директорию.

Как найти нужный файл?

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

Общий синтаксис команды find выглядит так:

1
$ find [папка] [критерий] [действие]

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

С помощью критериев можно задать особые условия поиска. Так, критерий -name осуществляет поиск по имени файла. Причем в имени можно задать шаблон. Например, такая команда будет искать все файлы с расширением txt:

1
$ find . -name"*.txt"

Критерий -type позволяет искать файлы по типу, которые бывают следующих видов:

  • f – простые файлы;
  • d – каталоги;
  • l – символические ссылки;
  • b – блочные устройства (dev);
  • c – символьные устройства (dev);
  • p – именованные каналы;
  • s – сокеты;

Например, указав критерий -type d будут перечислены только каталоги.

Довольно полезен критерий size, который задает размер файла. Можно искать файлы больше или меньше указанного размера с помощью символов + или -, либо по точному размеру, например так:

1
$ find . size +1G

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

Выводы:

  1. Для поиска файлов в Linux удобнее всего использовать команду find.
  2. Пример использования: find /home/ -size +1000000k

Как сделать резервную копию?

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

Rsync (Remote Sync) — это наиболее часто используемая команда для удаленного и локального копирования и синхронизации файлов и каталогов в системах Linux/Unix. С помощью команды rsync вы можете удаленно и локально копировать и синхронизировать данные между каталогами, дисками и сетевыми хранилищами, выполнять резервное копирование данных.

Программа rsync не всегда поставляется вместе с дистрибутивом, поэтому проверьте, есть ли она у вас. Если у вас команда rsync выдает сообщение о том, что программа не найдена, то вам надо установить ее командой:

1
$ sudo apt install rsync

Базовый синтаксис программы rsync выглядит так:

1
$ rsync options source destination

source и destination - это названия файлов или папок, соответственно, откуда и куда будет произведено копирование. Обычно происходит копирование из какой-то папки в папку или файл на другом разделе жесткого диска, даже на другой машине, по сети.

Как у любой мощной команды, у rsync большое количество опций. Перечисли самые полезные:

  • -v: подробный вывод.
  • -r: рекурсивно копирует данные (но не сохраняет временные метки и разрешения при передаче данных).
  • -a: режим архива, позволяет рекурсивно копировать файлы, а также сохраняет символические ссылки, права доступа к файлам, права владения пользователей и групп и временные метки.
  • -z: сжатие данных в ходе копирования.
  • -h: вывод информации о ходе копирования

Основной особенностью команды rsync по сравнению с обычным копированием является то, что она копирует данные инкрементально. То есть, если в месте назначения уже была более старая резервная копия, то rsync будет копировать только разницу, то есть то, что изменилось с последнего бекапа. Это позволяет сильно экономить на времени и ширине канала копирования, особенно, если вы делаете бекапы часто.

Кроме локального копирования, rsync позволяет так же просто делать бекапы по сети с или на удаленный хост. Для этого, он должен быть доступен по сети, мы должны знать его адрес (обычно, IP-адрес или доменное имя), а так же иметь учетные данные (то есть знать имя пользователя и его пароль на удаленной машине). Указать удаленную машину можно, например, так:

1
$ rsync -avz rpmpkgs/ root@192.168.0.100:/home/

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

Rsync, как и многие сетевые программы является клиент-серверной программой. Это значит, что для успешного общения двух машин по протоколу rsync необходимо, чтобы эта программа была установлена на обоих машинах. Более того, на удаленном компьютере должен быть настроен сервер rsync, то есть разрешены сетевые подключения к этой программе.

Для этого нужно создать файл настроек /etc/rsyncd.conf (создание файлов в системной папке /etc/ доступно только пользователю root) с примерно таким содержанием:

1
2
3
4
5
6
7
8
9
10
11
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsync.log
[share]
path = /tmp/share/
hosts allow = 192.168.56.1
hosts deny = *
list = true
uid = root
gid = root
read only = false

В этом файле мы для безопасности разрешаем удаленный доступ к данному компьютеру через rsync только с одного IP-адреса - 192.168.56.1. Вам, конечно, нужно прописать адрес той машины, с которой вы будете запускать бекапы.

После создания конфигурационного файла необходимо запустит сервер и добавить его в автозагрузку.

1
2
$ sudo systemctl start rsync
$ sudo systemctl enable rsync

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

Выводы:

  1. Программа Rsync используется для инкрементального резервного копирования.
  2. Команда rsync -avr /source/ /destination/ копирует содержимое одной папки в другую.
  3. Rsync позволяет копировать с или на удаленный хост используя протокол SSH.
  4. Синхронизация с удаленным хостом выполняется командой rsync -avz /tmp/ root@192.168.56.102:/home/
  5. Для работы с удаленным сервером там должен быть установлен и настроен сервер rsync.

Дата изменения: