Файловая структура *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 с загруженным туда контентом. Как вы увидите позже, пейджеры невероятно популярны и неявно запускаются другими программами.