Файловая система не только систематизирует данные, но и является основой метафоры «рабочего места» в Linux. Каждая выполняемая программа «работает» в строго определённом каталоге файловой системы. Такой каталог называется текущим каталогом, можно представлять, что программа во время работы «находится» именно в этом каталоге, это её «рабочее место». В зависимости от текущего каталога может меняться поведение программы: зачастую программа будет по умолчанию работать с файлами, расположенными именно в текущем каталоге — до них она «дотянется» в первую очередь. Текущий каталог есть у любой программы, в том числе и у командной оболочки (shell) пользователя. Поскольку взаимодействие пользователя с системой обязательно опосредовано командной оболочкой, можно говорить о том, что пользователь «находится» в том каталоге, который в данный момент является текущим каталогом его командной оболочки.
Все команды, отдаваемые пользователем при помощи shell, наследуют текущий каталог shell, т. е. «работают» в том же каталоге. По этой причине пользователю важно знать текущий каталог shell. Для этого служит утилита pwd
:
[methody@localhost methody]$ pwd
/home/methody
[methody@localhost methody]$
pwd
(аббревиатура от print working directory) возвращает полный путь текущего каталога командной оболочки, естественно, именно той командной оболочки, при помощи которой была выполнена команда pwd
. В данном примере текущим является каталог “/home/methody
”.
Текущий каталог, каков бы ни был полный путь к нему, всегда имеет ещё одно обозначение, “.
”, которое можно использовать, если по каким-то причинам требуется, чтобы даже в относительном пути к файлу, находящемуся в текущем каталоге, присутствовал элемент «имя каталога». Так, пути “text
” и “./text
” тоже приводят к одному и тому же файлу, однако в первом случае в строке пути не содержится ничего, кроме имени файла.
Отделить путь к файлу от его имени можно с помощью команд dirname
и basebane
соответственно:
[methody@localhost methody]$ basename /home/methody/text
text
[methody@localhost methody]$ basename text
text
[methody@localhost methody]$ dirname /home/methody/text
/home/methody
[methody@localhost methody]$ dirname ./text
.
[methody@localhost methody]$ dirname text
.
dirname
и basename
Мефодий заметил, что для “text
” и “./text
” dirname
выдало одинаковый результат: “.
”, что понятно: как было сказано выше, эти формы пути совершенно эквивалентны, а при автоматической обработке результатов dirname
гораздо лучше получить “.
”, чем пустую строку.
В любой момент можно просмотреть содержимое любого каталога при помощи утилиты ls
(сокращение от англ. «list» — «список»):
[methody@localhost methody]$ ls
-filename-with- text
[methody@localhost methody]$
ls
Поданная без параметров, команда ls
выводит список файлов и каталогов, содержащихся в текущем каталоге1.
Утилита ls
принимает один параметр: имя каталога, содержимое которого нужно вывести. Имя может быть задано любым доступным способом: в виде полного или относительного пути. Кроме параметра, утилита ls
«понимает» множество ключей, которые нужны главным образом для того, чтобы выводить дополнительную информацию о файлах в каталоге или выводить список файлов выборочно. Чтобы узнать обо всех возможностях ls
, нужно, конечно же, прочесть руководство по этой утилите (“man ls
”).
[methody@localhost methody]$ ls -F /
bin/ dev/ home/ mnt/ root/ swap/ tmp/ var/
boot/ etc/ lib/ proc/ sbin/ sys/ usr/
[methody@localhost methody]$
ls -F
В примере использован ключ-F, чтобы отличать файлы от каталогов. При наличии этого ключа ls
в конце имени каждого каталога ставит символ “/
”, чтобы показать, что в нём может содержаться что-то ещё. В выведенном списке нет ни одного файла — в корневом каталоге содержатся только подкаталоги.
Кроме того, можно получить более подробную информацию о содержимом каталога:
[methody@localhost methody]$ ls -aF
-filename-with- .bash_history .bashrc .lpoptions .rpmmacros Documents/
./ .bash_logout .emacs .mutt/ .xemacs/ text
../ .bash_profile .i18n .pinerc .xsession.d/ tmp/
[methody@localhost methody]$
ls -aF
Внезапно обнаружилось, что файлов в домашнем каталоге не два, а гораздо больше. Дело в том, что утилита ls
по умолчанию не выводит информацию об объектах, чьё имя начинается с “.
” — в том числе о “.
” и “..
”. Для того, чтобы посмотреть полный список содержимого каталога, и используется ключ “-a
” (all)2. Как правило, с “.
” начинаются имена конфигурационных файлов и конфигурационных каталогов.
“..
” — это ссылка на родительский каталог. Родительский каталог — это тот каталог, в котором находится данный. Родительским каталогом для “/home/methody
” будет каталог “/home
”: он получается просто отбрасыванием последнего имени каталога в полном пути. Иначе можно сказать, что родительский каталог — это один шаг по дереву каталогов по направлению к корню. “..
” — это сокращённый способ сослаться на родительский каталог: пока текущим каталогом является “/home/methody
”, относительный путь “..
” (или, что то же самое, “./..
”) будет эквивалентен “/home
”. С использованием “..
” можно строить сколь угодно длинные пути, такие как “../../usr/../var/log/../run/../../home
”3. Ссылки на текущий и на родительский каталог обязательно присутствуют в каждом каталоге в Linux. Даже если каталог пуст, т. е. не содержит ни одного файла или подкаталога, команда “ls -a
” выведет список из двух имён: “.
” и “..
”.
Пользователь может работать с файлами не только в своём домашнем каталоге, но и в других каталогах. В этом случае будет удобно сменить текущий каталог, т. е. «переместиться» в другую точку файловой системы. Для смены текущего каталога командной оболочки используется команда cd
(от англ. «change directory» — «сменить каталог»). Команда cd
принимает один параметр: имя каталога, в который нужно переместиться — сделать текущим. Как обычно, в качестве имени каталога можно использовать полный или относительный путь.
[methody@localhost methody]$ cd /home
[methody@localhost home]$ ls
methody shogun
[methody@localhost home]$ cd methody
[methody@localhost methody]$
Для перемещения в родительский каталог (“/home
”) удобно воспользоваться ссылкой “..
”. Необходимость вернуться в домашний каталог из произвольной точки файловой системы возникает довольно часто, поэтому командная оболочка поддерживает обозначение домашнего каталога при помощи символа “~
”. Поэтому чтобы перейти в домашний каталог из любого другого, достаточно выполнить команду “cd ~
”. При исполнении команды символ “~
” будет заменён командной оболочкой на полный путь к домашнему каталогу пользователя.
[methody@localhost methody]$ cd ..
[methody@localhost home]$ cd ~
[methody@localhost methody]$ cd ~shogun
[methody@localhost shogun]$ cd
[methody@localhost methody]$
При помощи символа “~
” можно ссылаться и на домашние каталоги других пользователей: “~имя пользователя
”. Команда cd
, поданная без параметров, эквивалента команде “cd ~
” и делает текущим каталогом домашний каталог пользователя.
Для этого используется утилита mkdir
. Она используется с одним обязательным параметром: именем создаваемого каталога. По умолчанию каталог будет создан в текущем каталоге.
[methody@localhost methody]$ mkdir examples
[methody@localhost methody]$ ls -F
-filename-with- Documents/ examples/ text tmp/
[methody@localhost methody]$
Для перемещения файлов и каталогов предназначена утилита mv
(сокращение от англ. «move» — «перемещать»). У mv
два обязательных параметра: первый — перемещаемый файл или каталог, второй — файл или каталог назначения. Имена файлов и каталогов могут быть заданы в любом допустимом виде: при помощи полного или относительного пути. Кроме того, mv
позволяет перемещать не только один файл или каталог, а сразу несколько. За подробностями о допустимых параметрах и ключах следует обратиться к руководству по mv
.
[methody@localhost methody]$ cd examples
[methody@localhost examples]$ mv ../text .
[methody@localhost examples]$ ls
text
[methody@localhost examples]$
Перемещение файла внутри одной файловой системы в действительности равнозначно его переименованию: данные самого файла при этом остаются на тех же секторах диска, изменяются каталоги, в которых произошло перемещение. Перемещение предполагает удаление ссылки на файл из того каталога, откуда он перемещён, и добавление ссылки на этот самый файл в тот каталог, куда он перемещён. В результате изменяется полное имя файла — полный путь, т. е. положение файла в файловой системе.
Иногда требуется создать копию файла: для большей сохранности данных, для того, чтобы создать модифицированную версию файла и т. п. В Linux для этого предназначена утилита cp
(сокращение от англ. «copy» — «копировать»). Утилита cp
требует присутствия двух обязательных параметров: первый — копируемый файл или каталог, второй — файл или каталог назначения. Как обычно, в именах файлов и каталогов можно использовать полные и относительные пути. Есть несколько возможностей при комбинации файлов и каталогов в параметрах cp
— о них можно прочесть в руководстве.
[methody@localhost examples]$ cp text text.bak
[methody@localhost examples]$ ls
text text.bak
Нужно иметь в виду, что в Linux утилита cp
нередко настроена таким образом, что при попытке скопировать файл поверх уже существующего не выводится никакого предупреждения. В этом случае файл будет просто перезаписан, а данные, которые содержались в старой версии файла, бесповоротно потеряны. Поэтому при использовании cp
следует всегда быть внимательным и проверять имена файлов, которые нужно скопировать.
В Linux для удаления файлов предназначена утилита rm
(сокращение от англ. «remove» — «удалять»).
[methody@localhost methody]$ rm examples/text
[methody@localhost methody]$ ls examples
test.bak
Однако удалить командой rm
каталог не получится:
[methody@localhost methody]$ rm examples
rm: невозможно удалить `examples': Is a directory
[methody@localhost methody]$ rmdir examples
rmdir: examples: Directory not empty
[methody@localhost methody]$ rm examples/test.bak
[methody@localhost methody]$ rmdir examples
[methody@localhost methody]$
Для удаления каталогов предназначена другая утилита — rmdir
(от англ. «remove directory»). Впрочем, rmdir
согласится удалить каталог только в том случае, если он пуст: в нём нет никаких файлов и подкаталогов. Удалить каталог вместе со всем его содержимым можно командой rm
с ключом “-r
” (recursive). Команда rm -r каталог
— очень удобный способ потерять в одночасье все файлы: она рекурсивно4 обходит весь каталог, удаляя всё, что попадётся: файлы, подкаталоги... а ключ “-f
” (force) делает её работу ещё неотвратимее, так как подавляет запросы вида «удалить защищённый от записи файл», так что rm
работает безмолвно и безостановочно.
В Linux не предусмотрено процедуры восстановления удалённых файлов и каталогов. Поэтому стоит быть очень внимательным, отдавая команду rm
и, тем более, rm -r
: нет никакой гарантии, что удастся восстановить случайно удалённые данные. Узнав об этом, Мефодий не огорчился, но подумал, что впредь будет удалять только действительно ненужные файлы, а всё сомнительное — перемещать с помощью mv
в подкаталог ~/tmp
, где оно не будет мозолить глаза, и где можно периодически наводить порядок.
1Вот пример утилиты, которая по умолчанию работает с файлами в текущем каталоге.
2Такое поведение ls
напоминает принцип работы файловых менеджеров со скрытыми файлами в системах dos/win. Разница в том, что в dos/win скрытые файлы предусмотрены файловой системой — файл может иметь атрибут «скрытый» и при этом называться как угодно. В Linux скрытые файлы — это не свойство файловой системы, а только соглашение по наименованию файлов.
3Не сразу понятно, что приводит этот путь всё туда же, в “/home
”.
4«Рекурсивно» по отношению к каталогам обозначает, что действие будет произведено над самим каталогом, его подкаталогами, подкаталогами его подкаталогов и т. д.