Linux - начинающим. Часть 4. Работаем с файловой системой. Практика

  • Автор:

linux-filesystem-2-000.jpg

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

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

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

linux-filesystem-2-001.jpgНо навыки работы с приложением, каким бы распространенным и удобным оно не было, не должны подменять навыки работы с системой. Поэтому на время забудем о его существовании и полностью окунемся в режим командной строки.

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

Навигация и базовые операции

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

pwd

На скриншоте ниже приглашение командной строки показывает, что мы находимся в домашней директории текущего пользователя, для ее краткого обозначения используется символ ~, команда pwd уточнит, что это /home/andrey.

linux-filesystem-2-002.jpgПолучить список файлов и папок в текущей директории можно командой:

ls

linux-filesystem-2-003.jpgПодробную информацию, включая типы файлов, права, владельцев и размер можно получить добавив ключ -l:

ls -l 

linux-filesystem-2-004.jpgВсе бы хорошо, но размер файлов в байтах не очень хорошо воспринимается, поэтому добавим ключ -h, а ключ -a покажет скрытые файлы и папки:

ls -lha

или

ls -l -h -a

как вам больше нравится.

linux-filesystem-2-005.jpgПолный список ключей можно получить командой:

ls --help | less

Передача вывода утилите less позволит выводить данные постранично, листание страниц производится клавишей Пробел, выход из режима кнопкой Q.

Также вы можете просмотреть содержимое любой интересующей вас директории, например:

ls -lh /var/www/deb8.lab

Вывод покажет нам содержимое /var/www/deb8.lab, хотя мы продолжаем находиться в домашней директории.

linux-filesystem-2-006.jpgДля перемещения по файловой системе служит иная команда:

cd

Если выполнить ее без параметров, она переместит нас в домашний каталог. Для перехода в иное место просто укажите каталог, можно использовать как абсолютные, так и относительные пути. Например:

cd /etc

переместит нас в каталог /etc вне зависимости от нашего прошлого положения, если потом выполнить:

cd squid3

то мы попадем в /etc/squid3

Команда

cd ..

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

cd /etc/php5

Перенесет нас в /etc/php5, а теперь выполнив

cd ../apache2

мы быстро сменим каталог на одноуровневый /etc/apache2. Это удобно когда вы находитесь в глубине файловой системы и набирать полный путь при помощи автодополнения может оказаться несколько утомительным.

А ну ка, попробуйте быстро перескочить из /var/www/client/data/www/example.com в /var/www/client/data/log? Да запросто:

cd ../../log

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

find name

Это произведет поиск файлов, папок, символьных ссылок и т.п. с именем name в текущей директории. Однако возможности команды find гораздо выше. Она позволяет не только искать файлы, но и выполнять над ними определенные действия.

Для лучшего поиска мы можем указывать тип файла, используя ключ -type, в этом случае доступными опциями ключа будут f - файл, d - директория, l - ссылка, ключ -name осуществляет поиск по имени, допускаются подстановочные символы. Если мы хотим искать по регулярному выражению - используем ключ -regex. Условия поиска можно сочетать при помощи логического И (ключ -a) и логического ИЛИ (ключ -o).

Например найдем все символические ссылки в директории /home

find /home -type l

Или найдем и выведем в файл все изображения JPG или PNG в папке с сайтом:

find /var/www/deb8.lab -name *.jpg -o -name *.png > ~/image.txt

Отлично, в наших руках полный список изображений:

linux-filesystem-2-008.jpgДопустим мы хотим найти только те изображения, которые загрузили, отбросив служебные картинки. Дополнительным критерием отбора может стать размер, скажем, 100 КБ для JPG и 200 КБ для PNG.

find /var/www/deb8.lab -name *.jpg -a -size +100k -o -name *.png -a -size +200k > ~/image.txt

linux-filesystem-2-009.jpgА теперь на мгновение задумайтесь, каким образом можно было бы решить такую задачу в графической среде? И за какое время?

Отдельно обратим ваше внимание на использование логических условий, несмотря на то, что нам нужно найти JPG и PNG мы используем оператор ИЛИ, так как файл не может являться одновременно и JPG и PNG. А добавляя условие размера используем И. Т.е. полностью условие читается так:

Найти если имя *.jpg И размер +100k ИЛИ имя *.png И размер +200k

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

Например, найдем все файлы в домашней директории измененные за последний час:

find ~ -mmin -60

linux-filesystem-2-010.jpgИли найдем и удалим все бекапы старше 7 дней:

find /var/backup -name backup* -mtime +7 -delete

Также команда find позволяет выполнять над найденными файлами произвольные действия, для этого используется ключ -exec command {} \;. Допустим нам надо быстро исправить права на папки и файлы в каталоге с сайтом:

find /var/www/deb8.lab -type d -exec chmod 0755 "{}" \;
find /var/www/deb8.lab -type f -exec chmod 0644 "{}" \;

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

Например:

cat image.txt

linux-filesystem-2-011.jpgТакже нельзя не упомянуть о команде tail, которая выводит на экран заданное количесто строк из указанного файла (по умолчанию 10), с ее помощью удобно просматривать последние логи. Например:

tail -2 /var/log/syslog

выведет на экран две последние строки /var/log/syslog, а будучи запущена с ключом -f команда будет отслеживать добавление новых строк и выводить их в на экран в режиме реального времени.

tail -f /var/log/syslog

linux-filesystem-2-012.jpg

Работа с файлами и папками

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

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

touch file1 file2

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

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

mkdir dir1 dir2

Используя ключ -p можно сразу создать дерево каталогов:

mkdir -p /dir2/dir3/dir4/dir5

Ключ -m позволяет сразу указать права доступа, например:

mkdir -m 0777 dir7

linux-filesystem-2-013.jpgКак видим директория сразу создалась с нужными правами.

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

cp image.txt dir7

Скопирует файл image.txt в директорию dir7, учтите, что по умолчанию уже существующие файлы перезаписываются, чтобы этого избежать добавьте ключ -i.

cp -i image.txt dir7

linux-filesystem-2-014.jpg

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

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

cp -r dir2 dir1

Для визуализации процесса можно использовать ключ -v, например:

cp -rv dir2 dir1

linux-filesystem-2-015.jpg

Это удобно когда вы вручную копируете значительное количество файлов и хотите видеть ход операции.

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

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

mv file1 file2

переименует файл file1 в file2, а команда:

mv file1 dir2

переместит file1 в каталог dir2, но если сделать так:

mv file1 dir2/file2

то мы переместим файл и переименуем одновременно.

Команда поддерживает ключи -i, -f и -n, которые означают тоже самое, что и у команды cp (спрашивать при замене, принудительно заменять и не заменять). При одновременном указании работает последний ключ. Также поддерживаются -v и -u, с теми же значениями, при работе с директориями указывать дополнительный ключ не надо.

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

cp (mv) источник1 источник2 ... источникN назначение

Для удаления файлов используйте rm, она поддерживает ключи -r (рекурсивно) для удаления директорий, -i и -f, с теми же значениями, ключ -v также выведет на экран информацию о ходе операции.

Например удалим файл:

rm file1

затем папку

rm -r dir2

В этом месте нельзя не вспомнить об очень старой и очень злой "шутке":

rm -rf /

Данная команда полностью удаляла корневую директорию с диска, от чего пострадало большое количество начинающих, вбивавших "подсказанные" команды не думая. В современных системах есть защита от такого действия - удалить корень просто так нельзя.

linux-filesystem-2-016.jpg

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

rm -rf /*

Казалось бы всего добавили один символ... Но смысл команды изменился, вместо удаления корневой директории она предписывает удалить ее содержимое. И удалит, все до чего дотянется. Тушим свет:

linux-filesystem-2-017.jpgСливаем воду:

linux-filesystem-2-018.jpg

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

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

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

Теперь несколько слов о ссылках, для их создания предназначена команда ln, не путать с ls. На самом деле запомнить команды Linux не сложно, если знать что большинство из них связано с сокращенным наименованием действия. Так и здесь: link (ссылка) - ln, list (список) - ls.

Запущенная без ключей команда создает жесткую ссылку:

ln file1 file1-1

Как мы помним, жесткая ссылка - это еще одно имя файла и после выполнения данной операции определить где исходный файл, а где ссылка решительно невозможно.

linux-filesystem-2-019.jpg

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

В повседневной работе удобнее всего использовать символические ссылки, для их создания потребуется указать ключ -s:

ln -s file1 file1-1

Если при создании ссылки использовались относительные пути, то ссылка тоже будет относительной, т.е. действительной только в текущем расположении. Например, если мы напишем:

ln -s file1 dir3/file1

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

ln -sr file2 dir3/file2

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

linux-filesystem-2-020.jpgДля чего это может быть полезным? Например, если вы находитесь в глубине файловой системы, скажем в /var/www/example/data/www/example.com/templates/system/images и вам надо сделать ссылку в соседний каталог. Это очевидный плюс. Но есть и еще один. Относительные ссылки будут работать даже при значительном изменении структуры размещения данных при условии, что ссылка и источник сохраняют взаимное расположение.

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

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

Работа с архивами

Теперь, когда вы умеете работать с файлами и папками самое время заняться архивами. Мы не будем подробно останавливаться на этой теме, уделив внимание только базовым операциям. Таких в повседневной работе ровно две: создать архив и извлечь его. В Linux наибольшее распространение получили архивы tar.gz или tar.bz, работа с которыми имеет свои особенности.

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

linux-filesystem-2-021.jpg

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

Но вернемся к команде tar, очень часто начинающие путаются с ключами и порядком их указания, но если разобраться в их значении, то все окажется очень просто. Самым первым указывается ключ основного действия, это может быть: - создать архив, -u - добавить файлы к архиву, -t - показать его содержимое и извлечь. Затем указываем дополнительные ключи, обычно это -v - выводить на экран ход операции. Данный ключ имеет смысл только в интерактивном режиме, в скриптах бесполезен.

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

tar -cf archive.tar file1

Эта команда создаст архив archive.tar и поместит в него файл file1. Теперь добавим туда файл file2:

tar -uf archive.tar file2

И просмотрим его содержимое:

tar -tf archive.tar

linux-filesystem-2-022.jpgОбратите внимание на вывод второй команды, мы добавили к ней ключ -v, и если создание архива без этого ключа прошло без вывода сообщений на экран, то команда добавления вывела имя добавленного файла.

Теперь извлечем содержимое архива:

tar -xf archive.tar

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

tar -xf archive.tar file1 

Данная команда извлечет из архива только файл file1.

И, наконец, сжатие. Чтобы сжать архив следует указать один из ключей: -z для gzip и -j для bzip2. При извлечении указывать данные ключи не нужно. Например:

tar -czf archive.tar.gz file1
tar -cjf archive.tar.bz2 file1

По общепринятой практике таким архивам присваивают расширения tar.gz или tgz для gzip и tar.bz2 или tbz2 для bzip2. Мы советуем следовать этому правилу, чтобы потом вам или вашему коллеге не пришлось гадать, а что это за файл тут лежит и чем именно он запакован.

Монтируем съемные носители

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

Для работы с ними в Linux существует виртуальное устройство cdrom, которое представляет файл символической ссылки на блочное устройство, соответствующее дисководу, например, sr0. Чтобы смонтировать оптический диск выполните:

mount /dev/cdrom /media

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

Для отмонтирования носителя используйте команду

umount /media

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

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

fdisk -l

Вывод покажет все дисковые накопители подключенные к вашей системе:

linux-filesystem-2-023.jpgКак видим, наша флешка определилась как /dev/sdb1 и имеет файловую систему FAT32, для монтирования используйте команду:

mount /dev/sdb1 /mnt

Теперь содержимое флешки будет доступно в директории /mnt. Иногда требуется явно указать тип файловой системы, для чего используется ключ -t с указанием типа ФС. Например, для FAT32 - vfat, для NTFS - ntfs.

linux-filesystem-2-024.jpg

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

Из опций монтирования вам может оказаться полезной опция -o ro, позволяющая смонтировать носитель только на чтение, оптические диски монтируются только на чтение автоматически. Например:

mount -o ro /dev/sdb1 /mnt

Отмонитровать носитель также можно командой umount, при этом можно использовать ключ -f для небезопасного отключения.

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

Онлайн-курс по устройству компьютерных сетей
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Дополнительные материалы:


  1. Linux - начинающим. Часть 1. Первое знакомство
  2. Linux - начинающим. Часть 2. Установка Ubuntu Server
  3. Linux - начинающим. Часть 3. Установка Debian 7 для сервера
  4. Linux - начинающим. Часть 4. Работаем с файловой системой. Теория
  5. Linux - начинающим. Часть 4. Работаем с файловой системой. Практика
  6. Linux - начинающим. Часть 5. Управление пакетами в Debian и Ubuntu
  7. Linux - начинающим. Часть 6. Управление пользователями и группами. Теория
  8. Linux - начинающим. Часть 6. Управление пользователями и группами. Практика
  9. Linux - начинающим. Часть 7. Потоки, перенаправление потоков, конвейер
  10. Настройка языка и региональных стандартов в Ubuntu Server/Debian
  11. Используем APT Pinning для закрепления пакетов в Debian и Ubuntu
  12. Linux - начинающим. Что такое Load Average и какую информацию он несет
  13. Обновляем снятый с поддержки дистрибутив Ubuntu
  14. Linux - начинающим. Обновление Debian до следующего выпуска
  15. Осваиваем эффективную работу в Midnight Commander
  16. Linux - начинающим. Что такое пространства подкачки и как они работают
  17. Linux - начинающим. Screen - многозадачность в терминале и ни единого разрыва!
  18. Linux - начинающим. Как узнать температуру процессора и накопителей
  19. Linux - начинающим. Как получить информацию об оборудовании ПК
  20. Linux - начинающим. Установка и первоначальная настройка Debian 11 для сервера

Помогла статья? Поддержи автора и новые статьи будут выходить чаще:

Поддержи проект!

Или подпишись на наш Телеграм-канал: Подпишись на наш Telegram-канал



Loading Comments