Основы Linux от основателя Gentoo. Часть 1 (2/4): Управление файлами и директориями

http://www.funtoo.org/en/articles/linux/lpi/1/
  • Перевод
Продолжение перевода первой части руководства. Начало тут.

В данном отрывке рассмотрены команды работы с файловой системой и файлами, такие как ls, mkdir, touch, mv, cp, затронуто использование echo и cat. Рассказано про иноды файловой системы.

Использование команд Linux


Знакомство с ls


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



$ cd /usr
$ ls
X11R6 doc i686-pc-linux-gnu lib man sbin ssl bin gentoo-x86 include libexec portage share tmp distfiles i686-linux info local portage.old src

Указав опцию -a, вы можете увидеть полный список, включая скрытые файлы и директории, начинающиеся с ".". Как видно в следующем примере, ls -a выводит также особые связывающие директории "." и "..":



$ ls -a
. bin gentoo-x86 include libexec portage share tmp .. distfiles i686-linux info local portage.old src X11R6 doc i686-pc-linux-gnu lib man sbin ssl

Развернутые списки директорий


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



В следующем примере мы использовали опцию -l чтобы отобразить содержимое моей директории /usr:



$ ls -l /usr
drwxr-xr-x 7 root root 168 Nov 24 14:02 X11R6 drwxr-xr-x 2 root root 14576 Dec 27 08:56 bin drwxr-xr-x 2 root root 8856 Dec 26 12:47 distfiles lrwxrwxrwx 1 root root 9 Dec 22 20:57 doc -> share/doc drwxr-xr-x 62 root root 1856 Dec 27 15:54 gentoo-x86 drwxr-xr-x 4 root root 152 Dec 12 23:10 i686-linux drwxr-xr-x 4 root root 96 Nov 24 13:17 i686-pc-linux-gnu drwxr-xr-x 54 root root 5992 Dec 24 22:30 include lrwxrwxrwx 1 root root 10 Dec 22 20:57 info -> share/info drwxr-xr-x 28 root root 13552 Dec 26 00:31 lib drwxr-xr-x 3 root root 72 Nov 25 00:34 libexec drwxr-xr-x 8 root root 240 Dec 22 20:57 local lrwxrwxrwx 1 root root 9 Dec 22 20:57 man -> share/man lrwxrwxrwx 1 root root 11 Dec 8 07:59 portage -> gentoo-x86/ drwxr-xr-x 60 root root 1864 Dec 8 07:55 portage.old drwxr-xr-x 3 root root 3096 Dec 22 20:57 sbin drwxr-xr-x 46 root root 1144 Dec 24 15:32 share drwxr-xr-x 8 root root 328 Dec 26 00:07 src drwxr-xr-x 6 root root 176 Nov 24 14:25 ssl lrwxrwxrwx 1 root root 10 Dec 22 20:57 tmp -> ../var/tmp

Первая колонка показывает информацию о правах доступа для каждого элемента. Чуть позже я объясню, как её интерпретировать. Следующая колонка содержит числа ссылок на каждый элемент файловой системы, позже мы вернемся к этому. Третья и четвертая колонки — это список владельцев и групп, соответственно. Пятая колонка — размер объекта. Шестая — время последнего изменения (mtime) объекта. И наконец, последняя колонка с именами объектов. Если файлы являются символическими ссылками, то вы увидите стрелку -> и путь, куда указывает эта символическая ссылка.



Смотрим на директории


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



$ ls -dl /usr /usr/bin /usr/X11R6/bin ../share
drwxr-xr-x 4 root root 96 Dec 18 18:17 ../share drwxr-xr-x 17 root root 576 Dec 24 09:03 /usr drwxr-xr-x 2 root root 3192 Dec 26 12:52 /usr/X11R6/bin drwxr-xr-x 2 root root 14576 Dec 27 08:56 /usr/bin

Рекурсивный и инодный списки


Так вы можете использовать -d чтобы смотреть на директорию, но также можно использовать -R для противоположного: не только лишь глянуть внутрь директории, но и рекурсивно посмотреть все директории с файлами внутри нее! Мы не включим в руководство никакого примера вывода для этой опции (поскольку обычно он очень объемный), но возможно вы захотите попробовать несколько команд ls -R и ls -Rl, чтобы почувствовать как это работает.



Наконец, опция -i может использоваться для отображения числа инодов для объектов в списке файловой системы:



$ ls -i /usr
1409 X11R6 314258 i686-linux 43090 libexec 13394 sbin 1417 bin 1513 i686-pc-linux-gnu 5120 local 13408 share 8316 distfiles 1517 include 776 man 23779 src 43 doc 1386 info 93892 portage 36737 ssl 70744 gentoo-x86 1585 lib 5132 portage.old 784 tmp

Понятие инода


Каждому объекту файловой системы назначен уникальный индекс, называемый номером инода. Это может показаться банальным, но понятие инодов очень важно для понимания большинства операций в файловой системе. Рассмотрим например ссылки "." и "..", которые появляются в каждой директории. Чтобы полностью понять, чем на самом деле является директория "..", мы сперва взглянем на номер инода у /usr/local:



$ ls -id /usr/local
5120 /usr/local


У директории /usr/local номер инода равен 5120. А теперь посмотрим номер инода у /usr/local/bin/..:



$ ls -id /usr/local/bin/..
5120 /usr/local/bin/..


Как видно, директория /usr/local/bin/.. имеет такой же номер, как у /usr/local! Посмотрим, как можно справиться с этим шокирующим откровением. В прошлом мы полагали, что /usr/local сама является директорией. Теперь же, мы обнаружили, что фактически директория — это инод с номером 5120, и нашли, по меньшей мере, два элемента (называемых «ссылками»), которые указывают на данный инод. И /usr/local, и /usr/local/bin/.. — ссылки на 5120-ый инод. Хотя этот инод и существует только в одном месте на диске, тем не менее на него может быть множество ссылок.



На самом деле, мы даже можем увидеть общее количество ссылок ведущих на этот, 5120 инод, используя команду ls -dl:



$ ls -dl /usr/local
drwxr-xr-x 8 root root 240 Dec 22 20:57 /usr/local

Если взглянуть на вторую колонку слева, то видно, что на директорию /usr/local (инод 5120) ссылаются восемь раз. На моей системе на этот инод ведут следующие пути:



/usr/local
/usr/local/.
/usr/local/bin/..
/usr/local/games/..
/usr/local/lib/..
/usr/local/sbin/..
/usr/local/share/..
/usr/local/src/..


mkdir


Давайте быстренько пройдемся по команде mkdir, которая используется для создания новых директорий. Следующий пример создает три новых директории, tic, tac, и toe, все внутри /tmp:



$ cd /tmp
$ mkdir tic tac toe


По умолчанию, команда mkdir не создает для вас родительские директории; весь путь вплоть до последнего (создаваемого) элемента должен существовать. Так, если вы захотите создать вложенные директории won/der/ful, вам придется выполнить три отдельные команды mkdir:



$ mkdir won/der/ful
mkdir: cannot create directory `won/der/ful': No such file or directory
$ mkdir won
$ mkdir won/der
$ mkdir won/der/ful


Однако, у mkdir есть очень удобная опция -p, которая говорит mkdir создавать любые отсутствующие родительские директории, как можете увидеть тут:



$ mkdir -p easy/as/pie

В целом очень просто. Чтобы узнать больше о команде mkdir наберите man mkdir и прочитайте инструкцию. Это же касается почти всех команд, рассмотренных здесь (например man ls), исключая cd, которая встроена в bash.



touch


Сейчас мы собираемся окинуть взглядом команды cp и mv, используемые для копирования, переименования и перемещения файлов и директорий. Но начнем обзор воспользовавшись командой touch, чтобы создать файл в /tmp:



$ cd /tmp
$ touch copyme


Команда touch обновляет «mtime» (время последней модификации — прим. пер.) файла, если тот существует (вспомните шестую колонку в выводе ls -l). Если файл не существует, то новый, пустой файл будет создан. Сейчас у вас должен быть файл /tmp/copyme с нулевым размером.



echo


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



$ echo "firstfile"
firstfile


А сейчас, та же команда echo, но с перенаправлением вывода:



$ echo "firstfile" > copyme

Знак «больше» сообщает оболочке записывать вывод echo в файл по имени copyme. Этот файл будет создан, если не существовал, или перезаписан, если существует. Набрав ls -l, увидим, что файл copyme имеет размер в 10 байт, так как содержит слово firstfile и символ новой строки:



$ ls -l copyme
-rw-r--r-- 1 root root 10 Dec 28 14:13 copyme

cat и cp


Чтобы вывести содержимое файла на терминал, используйте команду cat:



$ cat copyme
firstfile


Сейчас, мы можем воспользоваться основным вызовом команды cp для создания файла copiedme из оригинального copyme:



$ cp copyme copiedme

Ниже проверим, что это действительно разные файлы; у них отличаются номера инодов:



$ ls -i copyme copiedme
648284 copiedme 650704 copyme

mv


А сейчас давайте воспользуемся командой mv для переименования copiedme в movedme. Номер иноды останется прежний; однако, имя файла, указывающее на инод, изменится.



$ mv copiedme movedme
$ ls -i movedme
648284 movedme

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



Пока мы рассказываем об mv, давайте посмотрим, как еще можно использовать эту команду. mv, помимо возможности переименовать файлы, позволяет перемещать один или более файлов в другое место в иерархии директорий. Например, чтобы переместить /var/tmp/myfile.txt в директорию /home/drobbins (которая является моей домашней), я наберу (а мог бы воспользоваться ~ — прим. пер.):



$ mv /var/tmp/myfile.txt /home/drobbins

После этого myfile.txt будет перемещен в /home/drobbins/myfile.txt. И если /home/drobbins располагается в другой файловой системе, нежели /var/tmp, команда mv скопирует myfile.txt в новую файловую систему и удалит его из старой. Как вы уже могли догадаться, когда myfile.txt перемещается между файловыми системами, то myfile.txt на новом месте получает новый номер инода. Это все потому, что у каждой файловой системы свой независимый набор номеров инодов.



Мы также можем воспользоваться mv для перемещения нескольких файлов в одну директорию. К примеру, чтобы переместить myfile1.txt и myarticle3.txt в /home/drobbins, потребуется набрать:



$ mv /var/tmp/myfile1.txt /var/tmp/myarticle3.txt /home/drobbins

Продолжение...



Об авторах


Daniel Robbins


Дэниэль Роббинс — основатель сообщества Gentoo и создатель операционной системы Gentoo Linux. Дэниэль проживает в Нью-Мехико со свой женой Мэри и двумя энергичными дочерьми. Он также основатель и глава Funtoo, написал множество технических статей для IBM developerWorks, Intel Developer Services и C/C++ Users Journal.



Chris Houser


Крис Хаусер был сторонником UNIX c 1994 года, когда присоединился к команде администраторов университета Тэйлора (Индиана, США), где получил степень бакалавра в компьютерных науках и математике. После он работал во множестве областей, включая веб-приложения, редактирование видео, драйвера для UNIX и криптографическую защиту. В настоящий момент работает в Sentry Data Systems. Крис также сделал вклад во множество свободных проектов, таких как Gentoo Linux и Clojure, стал соавтором книги The Joy of Clojure.



Aron Griffis


Эйрон Гриффис живет на территории Бостона, где провел последнее десятилетие работая в Hewlett-Packard над такими проектами, как сетевые UNIX-драйвера для Tru64, сертификация безопасности Linux, Xen и KVM виртуализация, и самое последнее — платформа HP ePrint. В свободное от программирования время Эйрон предпочитает размыщлять над проблемами программирования катаясь на своем велосипеде, жонглируя битами, или болея за бостонскую профессиональную бейсбольную команду «Красные Носки».

Поделиться публикацией
Ой, у вас баннер убежал!

Ну. И что?
Реклама
Комментарии 44
  • +2
    Сорри, при первой попытке опубликовать, забыл выбрать тип публикации, что это «перевод», а не «топик».
    • +1
      VBart, еще раз огромное спасибо за перевод! Надеюсь вашего энтузиазма хватит как минимум на перевод всех 4х статей.
      • +2
        Куда я денусь, раз публика так жаждет. =)
        • 0
          А переводы: Bash by Example, Awk by Example, Sed by Example и прочей доки с funtoo.org будут?
          • +3
            Будут. А на счет прочих, не уверен. Не думаю, что многим интересен Funtoo Filesystem Guide
            • 0
              Вы мой герой!=)
              • 0
                Вот уж чего, а документации по sed,awk и bash итак вроде не мало :)
                • +1
                  документации хватает, но вся она разрознена и большинство статей, которые мне попадались были либо слишком «сухими», либо походили на «how to» по какой-либо команде. Здесь же информация достаточно понятно излагается и хорошо структурирована. А автору перевода спасибо не за «еще один перевод документации по linux», а за перевод действительно качественного туториала, качественным образом и за большую работу. Согласитесь, человеку есть что делать, помимо перевода документации.
      • 0
        Отлично! Когда ждать след. часть?
        • +1
          Не могу точно сказать. Эту часть собирался доделать еще вчера, но не успел. Мучаюсь тут от жары в Москве, а еще и работу надо работать. Скорее всего будет в понедельник.
      • 0
        Спасибо! Жду продолжения!
        Очень интересно и понятно, я сразу всё в консоли проверяю!
        • НЛО прилетело и опубликовало эту надпись здесь
          • +5
            Изыди отсюда, не заливай жиром экран. =)
            • 0
              Самый скучный и некчемный троль, из здесь обитающих.
          • 0
            Ну с инодами очень перемудрено… )) Я думаю, что большинство нихрена не поймет из описания. Если говорить об инодах, то нужно рассматривать их вместе с хардлинками и симлинками, понятиями файла и директории, вероятно тогда будет чуть более понятно о чем речь. А еще иноды вроде переводятся как «индексные узлы» :)
            • 0
              Про хард и сим линки как раз в следующем отрывке будет. inode — настолько устоявшийся термин, что уже даже почти никто не помнит, что значит i вначале.
              lkml.indiana.edu/hypermail/linux/kernel/0207.2/1182.html
              • 0
                Вот кстати да, что на один и тот же инод ссылается 8 разных — понял, а почему, зачем…
                • 0
                  Я думаю вам бы не понравилось, если бы вместо этого у вас данные хранились в 8 экземплярах. =)
                  • 0
                    Не, ну я подсознательно понимаю, что это скорее просто команда типа «один уровень вверх», но, как говорится, «хотелось бы уточнить». (:
                    • +1
                      Подсознательно надо понимать, что пути в файловой системе — суть второстепенная, это лишь ссылки на иноды с соответствующими номерами. И не один из этих 8 путей не является «главным», все равноправны. Задача ядра просмотрев список ссылок, найти искомую и получить из нее номер инода, а дальше уже вся работа происходит с инодом, без привязки на путь (сама ссылка уже может быть даже удалена или изменена).
              • 0
                спасибо, пока вродь это всё знаю, интересно дальше :)
                • 0
                  Про перенаправление потоков дальше будет? А то тут вскользь упомянулось, да и в одном варианте и направлении. Думаю, новичкам тоже будет полезно.
                  • 0
                    Да, будет. Про это рассказано ближе к концу второй части. А я еще только половину первой перевел.
                  • 0
                    Интересно, нет ли готовых или очень простых решений, чтобы в выводе ls -l размеры были указаны в байтах с разделителем (каждые три цифры)? Очень неудобно смотреть в (human readable) режиме -h, а именно одним взглядом определить файлы отличающиеся на несколько порядков (кб/мб/гб), одной буквы для этого мало.
                    • +1
                      На скорую руку:
                      [vbart@desktop Backups]$ ls -l | awk '{ printf "%'"'"'15d %s\n", $5, $9}'
                                    0 
                                4,096 250Gb
                           14,501,677 db_full_20100428-2229.sql
                            2,980,776 db_full_20100428-2229.sql.bz2
                           14,846,677 db_full.sql
                            3,081,879 db_full.sql.bz2
                                4,096 from160Gb
                               37,617 gsm.data.dump.sql
                                4,096 gsm_oldsite
                                4,096 mother
                                4,096 oldFrom500Gb
                      [vbart@desktop Backups]$
                      • +2
                        Сложновато я кавычку экранировал. Можно чуть проще:
                        ls -l | awk '{printf "%'\''15d %s\n", $5, $9}'
                        • 0
                          собственно что то похожее я и думал (и делал но так как усилий тратилось мало, до рабочего результата не дошло) только если пойти чуть дальше — например выделять. и… (а то у вас файл с 0 размером без имени появился в выводе) то лучше уж свою утилиту написать или еще более правильно — добавить функционал в coreutils. Я надеялся на волшебную опцию ;)

                          p.s. gentoo — не работает %'15d в printf и не ругается (точнее вывод без разделителя групп но выравнивает до 15 символов), в man 3 printf
                          ' For decimal conversion (i, d, u, f, F, g, G) the output is to be grouped with thousands' grouping characters if the locale
                          information indicates any. Note that many versions of gcc(1) cannot parse this option and will issue a warning. SUSv2
                          does not include %'F.
                          • 0
                            Ну я тоже сперва хотел посоветовать написать скрипт-обертку или чуть подправить ls в coreutils, но вы поставили условие «готовых или очень простых». =) Если бы волшебная опция была, вы бы ее скорее всего уже вычитали в мане.
                            • 0
                              Есть еще такое замечание:
                              '
                              A single quote or apostrophe character is a POSIX extension to ISO C. It indicates that the integer part of a floating point value, or the entire part of an integer decimal value, should have a thousands-separator character in it. This only works in locales that support such characters.

                              Отсюда: www.gnu.org/manual/gawk/html_node/Format-Modifiers.html

                              У вас локаль какая стоит? В арче на десктопе и генту на ноуте — выводит с разделителем. В генту на сервере — без, как у вас видимо. =)
                              • 0
                                Собственно в мане тоже про это указано, но можно и не обратить внимания: if the locale
                                information indicates any
                                • 0
                                  ls -l | LC_ALL=en_US.UTF-8 awk '{printf "%'\''15d %s\n", $5, $9}'

                                  универсальный рабочий вариант =)
                          • +1
                            Честно говоря, я не очень понял с инодами.

                            $ ls -di /usr/local
                            134385 /usr/local

                            $ ls -di /usr/local/bin
                            260981 /usr/local/bin

                            У меня у этих директорий разные иноды. Однако на /usr/local ссылается 10 инодов:
                            drwxr-xr-x 10 root root 4096 2010-03-18 03:46 /usr/local

                            Но как посмотреть какие именно? Из статьи следуют, что вложенные каталоги, ссылаются на родительские… но судя по моему выводу команды ls это не так… чего-то вообще бред. Разъяснит кто? :)
                            • +3
                              Вы потеряли ".."
                              [vbart@desktop ~]$ ls -di /usr/local
                              654837 /usr/local
                              [vbart@desktop ~]$ ls -di /usr/local/bin/..
                              654837 /usr/local/bin/..
                              [vbart@desktop ~]$

                              • +3
                                Из статьи не следует, что вложенные каталоги ссылаются на родительские. А следует, что каталоги с именами ".." ссылаются на родительские для каталога в котором находятся, а каталоги с именами "." ссылаются на собственный родительский.

                                [vbart@desktop ~]$ ls -di /usr/local/.
                                654837 /usr/local/.
                                [vbart@desktop ~]$ ls -di /usr/local/bin/../.
                                654837 /usr/local/bin/../.
                                • 0
                                  А… а отсюда, соответственно, следует, что количество ссылок = колличество вложенных каталогов. Огромное спасибо за разъяснение! Может быть стоит включить это в текст перевода, как примечание от автора? :)

                                  Как-то не думал раньше, что… и. это отдельные каталоги. Думал, что это комманды системы.
                                  • 0
                                    количество ссылок = колличество вложенных каталогов

                                    Нет. Правильно тогда уж было бы: «количество ссылок ≥ колличество вложенных каталогов + 2»

                                    Почему +2
                                    Помимо каталогов… внутри вложенных, на инод с директории также ссылается сама директория и директория "." внутри нее.

                                    Создадим пустой каталог и проверим:
                                    [vbart@desktop ~]$ mkdir test
                                    [vbart@desktop ~]$ ls -di test
                                    41038 test
                                    [vbart@desktop ~]$ ls -dl test
                                    drwxr-xr-x 2 vbart vbart 4096 Jul 17 00:28 test

                                    В данном случае на инод с номером 41038 ведут две ссылки: test и test/.

                                    Почему ≥
                                    Потому, что помимо создаваемых автоматически, пользователи или программы могут создавать еще дополнительные ссылки. Об этом пойдет речь в следующем фрагменте перевода.
                                    • 0
                                      Хотя на счет "≥" я наверное все же не прав в отношении каталогов. В Linux есть ограничение, нельзя создать жесткую ссылку на каталог. А вот на файл можно.
                                    • 0
                                      Как-то не думал раньше, что… и. это отдельные каталоги.

                                      Тут самое главное, собственно, надо понимать, что сам каталог один, и привязан он не к пути, а к иноду с номером таким-то, а все остальное, просто ссылки на него в файловой системе.
                                • 0
                                  Добавил Funtoo.org в закладки, буду ждать переводов.
                                  • +1
                                    (а мог бы вопсользоваться ~ — прим. пер.):

                                    Хорошие переводчики тоже очепятываются =)
                                    • 0
                                      Спасибо. Поправил. =)
                                    • 0
                                      Кстати, ls -a = la
                                      • 0
                                        Это у вас алиас прописан.

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

                                      Самое читаемое