Моя цель: рассмотреть подробней основные команды для работы с файлами в Linux; команды для работы с каталогами, ссылками; рассказать о правах доступа к файлам и каталогам, атрибутах, как их изменить; команды поиска. Немного практики.
Друзья, некоторые пользователи Linux даже не подозревают о том, что существует консоль. Да, таково новое поколение Linux-пользователей, которым проще использовать графический файловый менеджер, чем вводить команды. Но если вы хотите стать квалифицированным пользователем Linux, то просто обязаны знать, как работать в консоли.
Основные команды Linux для работы с файлами.
Команда Назначение
touch <файл> Создает пустой файл
cat <файл> Просмотр текстового файла
tac <файл> Вывод содержимого текстового файла в обратном порядке, т. е. сначала выводится последняя строка, потом предпоследняя и т. д.
cp <файл1> <файл2> Копирует файл <файл1> в файл <файл2>. Если <файл2> существует, программа попросит разрешение на его перезапись
mv <файл1> <файл2> Перемещает файл <файл1> в файл <файл2>. Эту же команду можно использовать и для переименования файла
rm <файл> Удаляет файл
locate <файл> Производит быстрый поиск файла
which <программа> Выводит каталог, в котором находится программа, если она вообще установлена. Поиск производится в каталогах, указанных в переменной окружения PATH (это путь поиска программ)
less <файл> Используется для удобного просмотра файла с возможностью скроллинга (постраничной прокрутки)
Попробуйте ввести в Терминале небольшую последовательность команд:
Первая команда (touch) создает в текущем каталоге файл file.txt.
Вторая команда (echo) записывает строку some text в этот же файл. Напомню, символ «>» — это символ перенаправления ввода/вывода.
Третья команда (cat) выводит содержимое файла — в файле записанная нами строка some text.
Четвертая команда (cp) копирует файл file.txt в файл с именем file-copy.txt. После этого мы опять используем команду cat, чтобы вывести содержимое файла file-copy.txt— чтобы убедиться, что файл действительно скопировался.
Шестая команда (rm) удаляет файл file.txt. (При удалении система можетспросить, хотите ли вы удалить файл. Если хотите удалить, то нужно нажать клавишу <Y>, а если нет, то <N>.) Точно ли файл удален? Убедимся в этом: введите команду cat file.txt. Система нам сообщает, что нет такого файла.
Восьмая команда (mv) переименовывает файл file-copy.txt в файл file.txt. Последняя команда выводит исходный файл file.txt. Особых проблем с этими командами у вас не должно возникнуть.
Вместо имени файла иногда очень удобно указать маску имени файла. Например, у нас есть много временных файлов, имена которых заканчиваются фрагментом tmp. Для их удаления нужно воспользоваться командой: rm *tmp.
Если же требуется удалить все файлы в текущем каталоге, можно просто указать звездочку: rm *.
Аналогично можно использовать символ «?», который, в отличие от звездочки, заменяющей последовательность символов произвольной длины, заменяет всего один символ. Например, нам нужно удалить все файлы, имена которых состоят из трех букв и начинаются на «s»:
rm s??
Будут удалены файлы s14, sqm, sr6и т. д., но не будут тронуты файлы, имена которых состоят более чем из трех букв и которые не начинаются на «s».
Маски имен можно также использовать и при работе с каталогами.
Работа с каталогами.
Основные команды для работы с каталогами:
Команда Описание
mkdir <каталог> Создание каталога
cd <каталог> Изменение каталога
ls <каталог> Вывод содержимого каталога
rmdir <каталог> Удаление пустого каталога
rm -r <каталог> Рекурсивное удаление каталога
При указании имени каталога можно использовать следующие символы:
. — означает текущий каталог. Если вы введете команду cat ./file, то она выведет файл file, который находится в текущем каталоге;
.. — родительский каталог. Например, команда cd .. переведет вас на один уровень вверх по дереву файловой системы;
~ — домашний каталог пользователя.
Попробуем поработать с каталогами на практике. Выполните в Терминале следующие команды:
Первая команда (mkdir) создает каталог directory в текущем каталоге. Вторая команда (cd) переводит (изменяет каталог) в только что озданный каталог. Следующие две команды touch создают в новом каталоге два файла — file1.txtи file2.txt.
Команда ls без указания каталога выводит содержимое текущего каталога. Команда cd .. переводит в родительский каталог. Как уже было отмечено, в Linux родительский каталог обозначается так .. (две точки), а текущий так . (одна точка). То есть, находясь в каталоге directory, мы можем обращаться к файлам file1.txt и file2.txt без указания каталога или же так ./file1.txt и ./file2.txt.
Еще раз хочу обратить ваше внимание — в Linux, в отличие от Windows, для разделения элементов пути используется прямой слэш (/), а не обратный (\)!
Кроме обозначений .. и . в Linux часто используется обозначение ~ — это домашний каталог. Предположим, что наш домашний каталог home/vladimir. В нем мы создали подкаталог dir и поместили в него файл file1.txt. Полный путь к файлу можно записать так:
/home/vladimir/dir/file1.txt
или же так:
~/dir/file1.txt
Как видим, тильда ( ~ ) заменяет часть пути. Удобно? Конечно!
Поскольку мы находимся в родительском для каталога directory каталоге, чтобы вывести содержимое только что созданного каталога, в команде ls нам нужно четко указать имя каталога:
ls directory
Команда rm используется для удаления каталога. Но что мы видим — система отказывается удалять каталог! Пробуем удалить его командой rmdir , но и тут отказ.
Система сообщает нам, что каталог не пустой, т. е. содержит файлы. Для удаления каталога нужно удалить все файлы. Конечно, делать это не всегда удобно, поэтому проще указать опцию -r команды rm для рекурсивного удаления каталога. В этом случае сначала будут удалены все подкаталоги (и все файлы в этих подкаталогах), а затем будет удален сам каталог.
Команды cp и mv работают аналогично: для копирования (перемещения/переименования) сначала указывается каталог-источник, а потом каталог-назначение.
Для каталогов желательно указывать параметр -r , чтобы копирование (перемещение) проходило рекурсивно.
Использование ссылок. Команда ln
В Linux допускается, чтобы один и тот же файл существовал в системе под разными именами. Для этого используются ссылки. Ссылки бывают двух типов: жесткие и символические. Жесткие ссылки жестко привязываются к файлу — вы не можете удалить файл, пока на него указывает хотя бы одна жесткая ссылка. А вот если на файл указывают символические ссылки, его удалению ничто не помешает.
Жесткие ссылки не могут указывать на файл, который находится за пределами файловой системы. Предположим, у вас два Linux-раздела: один корневой, а второй используется для домашних файлов пользователей и монтируется к каталогу /home корневой файловой системы. Так вот, вы не можете создать в корневой файловой системе ссылку, которая ссылается на файл в файловой системе, подмонтированной к каталогу /home. Это очень важная особенность жестких ссылок. Если вам нужно создать ссылку на файл, который находится за пределами файловой системы, вам следует использовать символические ссылки.
Для создания ссылок используется команда ln :
ln file.txt link1
ln -s file.txt link2
Первая команда создает жесткую ссылку link1, ссылающуюся на текстовый файл file.txt. Вторая команда создает символическую ссылку link2, которая ссылается на этот же текстовый файл file.txt.
Модифицируя ссылку (все равно какую — link1 или link2), вы автоматически модифицируете исходный файл — file.txt.
Особого внимания заслуживает операция удаления. По идее, если вы удаляете ссылку link2, файл file.txt также должен быть удален, но не тут-то было — вы не можете его удалить до тех пор, пока на него указывает хоть одна жесткая ссылка.
При удалении ссылки link2 просто будет удалена символическая ссылка, но жесткая ссылка и сам файл останутся. Если же вы удалите ссылку link1, будет удален и файл file.txt, поскольку на него больше не ссылается ни одна жесткая ссылка.
Права доступа и атрибуты файла. Команды chown, chmod и chattr
Права доступа к файлам и каталогам
Для каждого каталога и файла вы можете задать права доступа. Точнее, права доступа автоматически задаются при создании каталога/файла, а вам при необходимости можно их изменить. Какая может быть необходимость? Например, вам нужно, чтобы к вашему файлу-отчету смогли получить доступ пользователи — члены вашей группы. Или вы создали обычный текстовый файл, содержащий инструкции командного интерпретатора. Чтобы этот файл стал сценарием, вам нужно установить право на выполнение для этого файла.
Существуют три права доступа: чтение ( r ), запись ( w ), выполнение ( x ). Для каталога право на выполнение означает право на просмотр содержимого каталога. Вы можете установить разные права доступа для владельца (т. е. для себя), для группы владельца (т. е. для всех пользователей, входящих в одну с владельцем группу) и для прочих пользователей. Пользователь root может получить доступ к любому файлу или каталогу вне зависимости от прав, которые вы установили.
Чтобы просмотреть текущие права доступа, введите команду:
ls -l <имя файла/каталога>
Например,
ls -l video.txt
В ответ программа выведет следующую строку:
-r -- r ----- 1 vladimir group 300 Apr 11 11:11 video.txt
В этой строке фрагмент: -r--r----- описывает права доступа:
первый символ - это признак каталога. Сейчас перед нами файл. Если бы перед нами был каталог, то первый символ был бы символом d (от directory);
последующие три символа (r--) определяют права доступа владельца файла или каталога. Первый символ — это чтение, второй — запись, третий — выполнение. Как можно видеть, владельцу разрешено только чтение этого файла, запись и выполнение запрещены, поскольку в правах доступа режимы w и x не определены;
следующие три символа (r--) задают права доступа для членов группы владельца. Права такие же, как и у владельца: можно читать файл, но нельзя изменять или запускать.
последние три символа (---) задают права доступа для прочих пользователей.
Прочие пользователи не имеют права ни читать, ни изменять, ни выполнять файл. При попытке получить доступ к файлу они увидят сообщение Access denied.
ЗАМЕЧАНИЕ:
После прав доступа команда ls выводит имя владельца файла, имя группы владельца, размер файла, дату и время создания, а также имя файла.
Права доступа задаются командой chmod . Существуют два способа указания прав доступа: символьный (когда указываются символы, задающие право доступа, — r , w , x ) и абсолютный.
Так уж заведено, что в мире UNIX чаще пользуются абсолютным методом. Разберемся, в чем он заключается. Рассмотрим следующий набор прав доступа:
rw-r-----
Данный набор прав доступа предоставляет владельцу право чтения и модификации файла ( rw- ), запускать файл владелец не может. Члены группы владельца могут только просматривать файл ( r-- ), а все остальные пользователи не имеют вообще никакого доступа к файлу.
Возьмем отдельный набор прав, например, для владельца: rw- .
Чтение разрешено — мысленно записываем 1, запись разрешена — запоминаем еще 1, а вот выполнение запрещено, поэтому запоминаем 0. Получается число 110.
Если из двоичной системы перевести число 110 в восьмеричную, получится число 6.
Аналогично произведем разбор прав для членов группы владельца. Получится двоичное 100, т. е. восьмеричное 4. С третьим набором ( --- ) все вообще просто — это 000, т. е. 0.
Записываем полученные числа в восьмеричной системе в порядке владелец-группа-остальные. Получится число 640 — это и есть права доступа. Для того чтобы установить эти права доступа, выполните команду:
chmod 640 <имя_файла>
Наиболее популярные права доступа:
644 — владельцу можно читать и изменять файл, остальным пользователям - только читать;
666 — читать и изменять файл можно всем пользователям;
777 — всем можно читать, изменять и выполнять файл.
ПРИМЕЧАНИЕ
Напомню, что для каталога право выполнения — это право просмотра оглавления каталога.
Иногда символьный метод оказывается проще. Например, у нас есть файл script, который нужно сделать исполнимым, для этого можно применить команду:
chmod +x script
Для того чтобы снять право выполнения, указывается параметр -x :
chmod -x script
Подробнее о символьном методе вы сможете прочитать в руководстве по команде chmod (выполнив команду man chmod ).
Смена владельца файла
Если вы хотите "подарить" кому-то файл, т. е. сделать какого-то пользователя владельцем файла, то вам нужно использовать команду chown :
chown пользователь файл
ПРИМЕЧАНИЕ
Возможно, что после изменения владельца файла вы сами не сможете получить к нему доступ, ведь владельцем будете уже не вы.
Специальные права доступа (SUID и SGID)
Мы рассмотрели обычные права доступа к файлам, но в Linux есть еще так называемые специальные права доступа: SUID (Set User ID root) и SGID (Set Group ID root).
Эти права доступа позволяют обычным пользователям запускать программы, требующие для своего запуска привилегий пользователя root. Например, демон pppd требует привилегий root, но чтобы каждый раз при установке PPP-соединения (модемное, ADSL-соединение) не входить в систему под именем root, достаточно установить специальные права доступа для демона pppd. Делается это так:
chmod u+s /usr/sbin/pppd
Однако не нужно увлекаться такими решениями, поскольку каждая программа, для которой установлен бит SUID, является потенциальной "дырой" в безопасности вашей системы. Для выполнения программ, требующих прав root, намного рациональнее использовать программы sudo и su (описание которых можно получить по командам man sudo и man su ).
Атрибуты файла. Запрет изменения файла.
С помощью команды chattr можно изменить атрибуты файла. Параметр + устанавливает атрибут, а параметр – атрибут снимает. Например:
# chattr +i /boot/grub/menu.lst
Данная команда устанавливает атрибут i , запрещающий любое изменение, переименование и удаление файла. Установить этот атрибут, равно как и снять его, имеет право только суперпользователь или процесс с возможностью CAP_LINUX_IMMUTABLE . Чтобы изменить файл, нужно очистить атрибут с помощью команды:
# chattr -i /boot/grub/menu.lst
Если установить атрибут j , то все данные, прежде чем они будут записаны непосредственно в файл, будут сохранены в журнал файловой системы. Данный атрибут имеет смысл только, если файловая система смонтирована с опциями data=ordered или data=writeback . Когда файловая система смонтирована с опцией data=journal , данный атрибут не имеет значения, поскольку все данные файла и так уже журналируются.
Рассмотрим еще несколько атрибутов:
когда для файла установлен атрибут A (прописная буква!), тогда не происходит обновление записи atime (в ней хранится время доступа к файлу). Это позволяет избежать лишних дисковых операций ввода/вывода, что полезно для медленных компьютеров;
если для файла установлен атрибут a , в файл можно только добавлять данные. Этот атрибут имеет право установить (или очистить) суперпользователь или процесс с возможностью CAP_LINUX_IMMUTABLE;
атрибут c заставляет систему упаковывать (сжимать) содержимое файла, что позволяет сэкономить место на диске. При записи в файл информация автоматически сжимается и записывается на диск в уже сжатом виде, при чтении из этого файла возвращаются несжатые данные;
когда изменяется каталог с установленным атрибутом D , изменения сразу же записываются на диск. Это эквивалентно применению опции монтирования dirsync ;
если для файла установлен атрибут d , для него не будет выполнено резервное копирование программой dump;
при изменении файла с установленным атрибутом S его данные синхронно записываются на диск. Аналогично опции монтирования sync к подмножеству файлов;
когда удаляется файл с установленным атрибутом s , система выполняет обнуление его блоков и запись их обратно на диск;
при удалении файла с атрибутом u его содержимое сохраняется на диске, что позволяет впоследствии легко восстановить этот файл;
атрибуты X и Z используются экспериментальными заплатками сжатия для служебных целей.
Установить любой атрибут можно командой chattr , а просмотреть — командой lsattr . Об остальных атрибутах вы сможете прочитать в справочной системе:
man chattr
Команды поиска файлов: find, which и locate
Для поиска файлов в Linux используется команда find . Это довольно мощная утилита со сложным синтаксисом, и далеко не всегда она нужна обычному пользователю. Намного проще установить файловый менеджер, например mc и использовать встроенную в него функцию поиска.
Но команду find мы все же рассмотрим, по крайней мере ее основы. Синтаксис команды следующий:
find список_поиска выражение
Мощность команды find заключается во множестве самых разных параметров поиска, которые из-за их количества не так-то просто запомнить. К тому же find может выполнять операции над найденными файлами. Например, вы можете найти временные файлы и сразу удалить их.
Подробно опции команды find мы рассматривать не будем — это вы можете сделать самостоятельно с помощью команды man find . Здесь мы рассмотрим лишь несколько примеров использования этой команды:
найти файлы с именем a.out (точнее, в имени которых содержится строка
"a.out"), поиск начать с корневого каталога (/):
find / -name a.out
найти файлы по маске *.txt:
find / -name '*.txt'
найти файлы нулевого размера, поиск начать с текущего каталога (.):
find . -size 0c
Кстати, для поиска пустых файлов намного проще использовать параметр -empty :
find . -empty
найти файлы, размер которых от 100 до 150 Мбайт, поиск производить в домашнем каталоге и всех его подкаталогах:
find ~ -size +100M -size -150M
найти все временные файлы и удалить их (для каждого найденного файла будет запущена команда rm ):
# find / -name *.tmp -ok rm {} \;
Вместо параметра -ok можно использовать параметр -exec , который также запускает указанную после него команду, но не запрашивает подтверждение выполнения этой команды для каждого файла.
Кроме команды find можно использовать команды which и locate . Первая выводит полный путь к программе или к сценарию, если программа или сценарий находится в списке каталогов, заданном в переменной окружения PATH :
which sendmail
Команда locate ищет в базе данных демона located файлы, соответствующие заданному образцу. Недостаток этой команды в том, что located имеется далеко не во всех дистрибутивах, поэтому команды locate у вас может и не быть. Зато если located имеется и запущен, поиск файлов будет осуществляться быстрее, чем с помощью find .
В заключение.
Друзья, знание основных команд Linux, атрибутов, прав и т.д. просто необходимо! Я хочу, чтобы вы эти вещи освоили.
***
Вам понравилось, оказалось полезным? Ставьте, пожалуйста, "лайк"!
Буду рад вашим подпискам.