Файловая структура *nix систем серьёзно отличается от структуры в Windows и представляет собой дерево, в узлах которого находятся директории, а в листьях — файлы.
Кстати, понятие "папка" в *nix системах не используется, говорят "директория" или "каталог", хотя по существу эти термины означают одно и тоже.
В Windows файловая структура представлена не одним, а несколькими деревьями, так как каждая структура находится на своём диске. В *nix системах — единственное дерево с корнем (корень обозначен символом: /
). Все устройства, физические и логические диски находятся внутри этого дерева в виде директорий и файлов.
Информация о любом файле или директории доступна по команде stat
(file system status):
# Не обращайте внимание на непонятные для вас данные, об их значении поговорим позже
$ stat .bashrc
File: '.bashrc'
Size: 3771 Blocks: 8 IO Block: 4096 regular file
Device: ca01h/51713d Inode: 259234 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1002/kirill.m) Gid: ( 1002/kirill.m)
Access: 2018-08-27 17:24:11.237498138 +0000
Modify: 2015-08-31 23:27:45.000000000 +0000
Change: 2018-01-22 08:13:27.611966864 +0000
Birth: -
В Windows имена файлов регистронезависимы. В *nix системах регистр имеет значение. Файлы index.html
, Index.html
, INDEX.HTML
и index.HTML
— это разные файлы. Всегда обращайте внимание на регистр, потому что ошибиться довольно легко.
MacOS в этой ситуации идет по пути Windows и тоже не учитывает регистр
Говорят, что в *nix "всё есть файл". На нижнем уровне так и есть (почти). Директория — это специальный файл, который содержит список файлов. Любое подключаемое устройство становится файлом или директорией, если это накопитель. Такая концепция довольно удобна для разработчиков, потому что печать на принтер и вывод на экран между собой ничем не отличаются — для кода это просто "запись в файл". На пользовательском уровне директория всё же отличается от файла и имеет собственные команды для создания, удаления и модификации.
В *nix системах есть базовый набор каталогов, который стандартизирован FHS. За каждым закреплена какая-то особая роль. Например, каталог /etc
содержит конфигурацию программ в обычных текстовых файлах (в юниксах нет реестра, вся конфигурация лежит в обычных файлах), а каталог /home
содержит домашние директории пользователей системы (исключением является суперпользователь root
, его домашний каталог обычно находится по адресу /root
).
. В *nix системах развитая система прав, завязанная на пользователей и группы. Не во все директории можно заходить, не все файлы можно читать или менять, и не все программы можно запускать. Об этих правах поговорим позже. Пока достаточно знать, что такие ограничения есть. Их можно увидеть в выводе команды ls -l
.
В отличие от Windows, в *nix системах отсутствует понятие "расширение файла". Точка — полноправная часть имени. Это не значит, что в юниксах невозможно понять тип файла. Это возможно, более того, файлы почти всегда именуются так же, как и в Windows, например hello.mp3, но важно понимать, что вся эта строчка — имя файла. Нередко встречаются и такие имена: index.html.haml
. В *nix также есть скрытые файлы, но, в отличие от Windows, это не свойство файла, а определённое имя файла. Все файлы и директории, начинающиеся с точки, считаются скрытыми. Вывести все файлы, включая скрытые, можно командой ls -a
:
$ ls -a
. .. .bash_history .bash_logout .bashrc .cache .profile .ssh
Обратите внимание на две особые директории, обозначенные "точкой" (.
) и "двумя точками" (..
). Точка означает текущую директорию, а две точки — директорию верхнего уровня. Именно благодаря этой схеме работает команда cd ..
, которая перемещает нас на уровень выше.
Кроме регулярных файлов, в *nix существует ряд других:
- Hard Link — дополнительное имя для уже существующего файла.(жёсткая ссылка)
- Symbolic link — символическая ссылка, такой файл похож на ярлык в Windows. Если удалить основной файл, то символическая ссылка начнёт вести в никуда.
- Socket — специальный файл через который происходит взаимодействие между разными процессами операционной системы. Программисты постоянно сталкиваются с сокетами в реальной жизни.
Это наиболее важные типы файлов. Есть ещё и другие, но этого достаточно чтобы понять общее устройство файловой системы в POSIX совместимых ОС.
Теперь рассмотрим способы взаимодействия с файлами
Самый простой способ прочитать файл — команда cat
.
$ man cat
NAME
cat -- concatenate and print files
SYNOPSIS
cat [-benstuv] [file ...]
...
cat
ожидает аргументы — пути до файлов, которые надо читать. В простейшем случае достаточно передать один путь, это довольно удобно, когда надо посмотреть содержимое небольшого файла:
$ cat .bash_logout
# ~/.bash_logout: executed by bash(1) when login shell exits.
# when leaving the console clear the screen to increase privacy
if [ "$SHLVL" = 1 ]; then
[ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q
fi
Иногда бывает нужно посмотреть только начало файла или его конец, в такой ситуации помогают команды head
и tail
. Они тоже принимают на вход путь до файла, только head
показывает первые 10 строк, а tail
— последние 10 строк файла. Это поведение можно менять, задавая желаемое количество строк через опцию -n
.
Head
$ head -n 2 .bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
Tail
$ tail -n 2 .bashrc
fi
fi
Некоторые файлы наполняются очень интенсивно. Например, так называемые "логи". Логи (иногда говорят "журналы") — это текстовые файлы, в которые заносится информация о происходящих процессах в определённой системе. В этой ситуации поможет tail
, запущенный в особом режиме благодаря флагу -f
. tail -f path/to/file
не просто выводит последние строчки файла, но ждёт появления новых. Как только файл дописывается, tail
сразу выводит на экран добавленные строки. Для остановки её выполнения нажмите Ctrl + C.
# Вероятно у вас не хватит прав смотреть файл syslog( в каталоге /var/log), чтобы получить к нему доступ,
# наберите sudo перед командой tail как показано ниже, в следующих уроках этот вопрос рассматривается подробнее
# Есть вероятность того что sudo попросить вас ввести пароль. Сделайте это и нажмите Enter. При наборе пароля
# курсор не будет двигаться, это сделано для безопасности.
$ sudo tail -f syslog
Aug 28 18:00:01 ip-10-0-1-223 systemd-udevd[15400]: Could not generate persistent MAC address for veth5c6ed9c: No such file or directory
Aug 28 18:00:01 ip-10-0-1-223 kernel: [126412.013499] device veth6969122 entered promiscuous mode
Aug 28 18:00:01 ip-10-0-1-223 systemd[1]: Starting Update resolvconf for networkd DNS...
Aug 28 18:00:01 ip-10-0-1-223 systemd-timesyncd[522]: Network configuration changed, trying to establish connection.
Aug 28 18:00:01 ip-10-0-1-223 systemd-timesyncd[522]: Synchronized to time server 91.173.73.198:123 (ntp.ubuntu.com).
Aug 28 18:00:01 ip-10-0-1-223 sh[15415]: sed: cant read /run/systemd/netif/leases/*: No such file or directory
Aug 28 18:00:01 ip-10-0-1-223 kernel: [126412.086162] IPv6: ADDRCONF(NETDEV_UP): veth6969122: link is not ready
Aug 28 18:00:01 ip-10-0-1-223 systemd-udevd[15403]: Could not generate persistent MAC address for veth6969122: No such file or directory
Aug 28 18:00:02 ip-10-0-1-223 systemd-timesyncd[522]: Network configuration changed, trying to establish connection.
Aug 28 18:00:02 ip-10-0-1-223 systemd-timesyncd[522]: Synchronized to time server 91.173.73.198:123 (ntp.ubuntu.com).
Aug 28 18:00:02 ip-10-0-1-223 systemd-timesyncd[522]: Network configuration changed, trying to establish connection.
Особая категория программ для просмотра содержимого файла — пейджеры. Пейджер похож на текстовый редактор, но открытый только в режиме чтения. Самый распространённый пейджер называется less
. Попробуем открыть с помощью него файл syslog
:
# Снова придется воспользоваться sudo
$ sudo less syslog
# здесь много вывода
less
открывает файл и остаётся в этом режиме. Он позволяет перемещаться по файлу вперёд и назад, производить поиск. Одна из отличительных особенностей пейджеров состоит в том, что они одинаково хорошо и быстро работают с файлами любых размеров. Всё потому, что пейджер не пытается загрузить в память весь файл до его отображения. Он грузит только ту часть, которая помещается на экран и при перемещении подгружает остальное.
less
предоставляет несколько десятков команд для перемещения по тексту и его поиску, про большинство из них можно прочитать в соответствующем мануале. Здесь же затронем основные:
-
q
— выход -
f
— вперёд на страницу -
b
— назад на страницу - если набрать
/
, затем начать вводить буквы и нажать Enter, то выполнится поиск введённого текста. Перемещение по найденным совпадениям выполняется командойn
(переход к следующему совпадению) и командойN
(переход к предыдущему совпадению).
Возможно, вы увидели сходство поведения пейджеров с тем, что мы наблюдали в мануалах. Открою секрет: когда мы запускали man
, то перед нами открывался less
с загруженным туда контентом. Как вы увидите позже, пейджеры невероятно популярны и неявно запускаются другими программами.