Основы Linux от основателя Gentoo. Часть 1 (2/4): Управление файлами и директориями
Продолжение перевода первой части руководства. Начало тут.
В данном отрывке рассмотрены команды работы с файловой системой и файлами, такие как ls, mkdir, touch, mv, cp, затронуто использование echo и cat. Рассказано про иноды файловой системы.
Использование команд Linux
Знакомство с ls
А сейчас, мы быстренько пройдемся по команде ls. Скорее всего вы уже хорошо знакомы с этой командой, и знаете, что набрав ls получите список содержимого текущей рабочей директории:
Указав опцию -a, вы можете увидеть полный список, включая скрытые файлы и директории, начинающиеся с «.». Как видно в следующем примере, ls -a выводит также особые связывающие директории «.» и «..»:
Развернутые списки директорий
Вы также можете задать одну и более директорий или файлов в командной строке с ls. Если вы укажите файл, то ls покажет вам только этот файл. А если зададите директорию, то ls выдаст ее содержимое. Опция -l очень удобна, когда необходимо посмотреть права доступа, владельца, время последнего изменения и размер в списке содержимого директории.
В следующем примере мы использовали опцию -l чтобы отобразить содержимое моей директории /usr:
Первая колонка показывает информацию о правах доступа для каждого элемента. Чуть позже я объясню, как её интерпретировать. Следующая колонка содержит числа ссылок на каждый элемент файловой системы, позже мы вернемся к этому. Третья и четвертая колонки — это список владельцев и групп, соответственно. Пятая колонка — размер объекта. Шестая — время последнего изменения (mtime) объекта. И наконец, последняя колонка с именами объектов. Если файлы являются символическими ссылками, то вы увидите стрелку -> и путь, куда указывает эта символическая ссылка.
Смотрим на директории
Иногда вы захотите взглянуть на директорию, а не внутрь нее. В этом случае вы можете указать опцию -d, которая скажет ls рассматривать любую директорию, как внутреннюю:
Рекурсивный и инодный списки
Так вы можете использовать -d чтобы смотреть на директорию, но также можно использовать -R для противоположного: не только лишь глянуть внутрь директории, но и рекурсивно посмотреть все директории с файлами внутри нее! Мы не включим в руководство никакого примера вывода для этой опции (поскольку обычно он очень объемный), но возможно вы захотите попробовать несколько команд ls -R и ls -Rl, чтобы почувствовать как это работает.
Наконец, опция -i может использоваться для отображения номеров инодов для объектов в списке файловой системы:
Понятие инода
Каждому объекту файловой системы назначен уникальный индекс, называемый номером инода. Это может показаться банальным, но понятие инодов очень важно для понимания большинства операций в файловой системе. Рассмотрим например ссылки «.» и «..», которые появляются в каждой директории. Чтобы полностью понять, чем на самом деле является директория «..», мы сперва взглянем на номер инода у /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:
Если взглянуть на вторую колонку слева, то видно, что на директорию /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 «firstfile»
firstfile
А сейчас, та же команда echo, но с перенаправлением вывода:
$ echo «firstfile» > copyme
Знак «больше» сообщает оболочке записывать вывод echo в файл по имени copyme. Этот файл будет создан, если не существовал, или перезаписан, если существует. Набрав ls -l, увидим, что файл copyme имеет размер в 10 байт, так как содержит слово firstfile и символ новой строки:
cat и cp
Чтобы вывести содержимое файла на терминал, используйте команду cat:
$ cat copyme
firstfile
Сейчас, мы можем воспользоваться основным вызовом команды cp для создания файла copiedme из оригинального copyme:
$ cp copyme copiedme
Ниже проверим, что это действительно разные файлы; у них отличаются номера инодов:
А сейчас давайте воспользуемся командой mv для переименования copiedme в 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. В свободное от программирования время Эйрон предпочитает размыщлять над проблемами программирования катаясь на своем велосипеде, жонглируя битами, или болея за бостонскую профессиональную бейсбольную команду «Красные Носки».
Что делает "ls -la"?
Когда я вошел в -al Атрибут с помощью команды ls, я получил следующее:
Что означает каждый столбец и что означает total 76 обозначать здесь?
2 ответа
ls -al команда представляет собой комбинацию ls -l (используйте формат длинного списка) и ls -a (не игнорируйте записи, начинающиеся с.)
Результатом является длинный список ( ls -l часть) с (слева направо):
- тип файла
- права доступа к файлу
- количество ссылок
- имя владельца
- группа владельцев
- размер файла
- время последней модификации
- имя файла или каталога
в то время как ls -a означает, что скрытые файлы также перечислены.
смотрите также man ls (как всегда man является первым источником информации), и эта ссылка.
Еще немного объяснения того, что вы видите
Вывод начинается с количества дисковых блоков, используемых каталогом (в вашем случае 76). Из документации GNU:
Для каждого каталога, который указан в списке, предварите файлы строкой «Всего блоков», где «блоки» — это общее дисковое пространство для всех файлов в этом каталоге. Размер блока в настоящее время по умолчанию составляет 1024 байта, но это может быть переопределено.
Команда ls: примеры использования и опции
Команда ls – вероятно наиболее используемая команда в любой UNIX-системе. Её предназначение – вывод информации о файлах и каталогах. Дополнительные опции команды позволяют получить более подробную информацию и сортировать её определённым образом.
Далее будут приведены примеры опций и примеры их использования.
| -R | Рекурсивно обойти встретившиеся подкаталоги. |
| -a | Вывести список всех файлов (без этой опции не выводятся скрытые файлы, имена которых начинаются с точки). |
| -d | Если аргумент является каталогом, то выводить только его имя, а не содержимое. Часто используется с флагом -l для получения сведений о состоянии каталога. |
| -C | Вывод в несколько колонок с сортировкой по колонкам. |
| -x | Вывод в несколько колонок с сортировкой по строкам. |
| -m | Вывод в свободном формате, имена файлов разделяются запятыми. |
| -l | Вывод в длинном формате: перед именами файлов выдается режим доступа, количество ссылок на файл, имена владельца и группы, размер в байтах и время последней модификации (см. ниже). Если файл является специальным, то в поле размера выводится старший и младший номера устройства. |
| -n | То же, что и -l, но идентификаторы владельца и группы выводятся в виде чисел, а не в виде имен. |
| -o | То же, что и -l, но идентификатор группы не выводится. |
| -g | То же, что и -l, но идентификатор владельца не выводится. |
| -r | Изменить порядок сортировки на обратный алфавитный или, при наличии флага -t, сначала выводить более старые файлы. |
| -t | Имена файлов сортируются не по алфавиту, а по времени (сначала идут самые свежие файлы). По умолчанию используется время последнего изменения. См. также флаги -u и -c. |
| -u | Вместо времени последнего изменения использовать время последнего доступа для сортировки (с флагом -t) или для вывода (с флагом -l). |
| -c | Вместо времени последнего изменения использовать время последней модификации описателя файла (т.е. время создания файла, изменения режима доступа к нему и т.п.) для сортировки (с флагом -t) или для вывода (с флагом -l). |
| -p | Если файл является каталогом, то выдавать после его имени символ /. |
| -F | Если файл является каталогом, то выдавать после его имени символ /; если файл является выполняемым, то выдавать после его имени символ *. |
| -b | Выдавать непечатные символы, входящие в имя файла, в восьмеричном виде (ddd). |
| -q | Выдавать непечатные символы, входящие в имя файла, в виде символа ?. |
| -i | Выдавать в первой колонке номера описателей файлов. |
| -s | Выдавать размер файлов в блоках (включая косвенные блоки). |
| -f | Рассматривать каждый аргумент как каталог и выводить его содержимое. Этот флаг отменяет флаги -l, -t, -s, -r и включает флаг -a. Сортировка имен файлов не производится; имена выдаются в таком порядке, в каком они перечислены в каталоге. |
Теперь несколько примеров наиболее полезных опций.
Вывести список только каталогов:
# ls -d -1 /home/setevoy/*/
/home/setevoy/Desktop/
/home/setevoy/Downloads/
/home/setevoy/Dropbox/
/home/setevoy/Images/
/home/setevoy/Soft/
/home/setevoy/Temp/
/home/setevoy/VirtualBox VMs/
То же самое, но с использованием “длинного” (полного) вывода о каталогах:
# ls -dl /home/setevoy/*/
drwxr-xr-x 2 setevoy setevoy 4096 May 6 10:22 /home/setevoy/Desktop/
drwxr-xr-x 2 setevoy setevoy 4096 May 5 10:38 /home/setevoy/Downloads/
drwx—— 16 setevoy setevoy 4096 May 6 07:40 /home/setevoy/Dropbox/
drwxr-xr-x 2 setevoy setevoy 4096 May 5 12:00 /home/setevoy/Images/
drwxr-xr-x 2 setevoy setevoy 4096 May 5 18:29 /home/setevoy/Soft/
drwxrwxr-x 2 setevoy setevoy 4096 May 5 20:15 /home/setevoy/Temp/
drwxrwxr-x 4 setevoy setevoy 4096 May 5 19:09 /home/setevoy/VirtualBox VMs/
Ключ -l весьма полезен, так как позволяет проверять владельца и права на файлы/каталоги:
# ls -l
total 32
drwxr-xr-x 2 root root 4096 Aug 23 2012 bin
drwxr-xr-x 2 root root 4096 Aug 23 2012 etc
drwxr-xr-x 2 root root 4096 Aug 23 2012 games
drwxr-xr-x 2 root root 4096 Aug 23 2012 include
drwxr-xr-x 4 root root 4096 May 5 11:13 lib
lrwxrwxrwx 1 root root 9 May 5 10:22 man -> share/man
drwxr-xr-x 2 root root 4096 Aug 23 2012 sbin
drwxr-xr-x 7 root root 4096 Aug 23 2012 share
drwxr-xr-x 2 root root 4096 Aug 23 2012 src
Для вывода информации о скрытых файлах (начинаются с точки) используйте ключ -a :
# ls -la
ls: cannot access .gvfs: Permission denied
total 524
drwxr-xr-x 37 setevoy setevoy 4096 May 6 21:20 .
drwxr-xr-x 3 root root 4096 May 5 10:25 ..
drwx—— 3 setevoy setevoy 4096 May 5 10:39 .adobe
-rw——- 1 root root 517 May 5 11:53 .bash_history
-rw-r–r– 1 setevoy setevoy 220 May 5 10:25 .bash_logout
-rw-r–r– 1 setevoy setevoy 133 May 5 11:52 .bashrc
drwx—— 17 setevoy setevoy 4096 May 5 18:29 .cache
drwxrwxr-x 3 setevoy setevoy 4096 May 5 10:54 .compiz-1
drwx—— 20 setevoy setevoy 4096 May 6 10:38 .config
drwx—— 3 setevoy setevoy 4096 May 5 10:38 .dbus
Про ошибку с .gvfs можно почитать в статье ls: cannot access .gvfs: Permission denied.
Кратко остановимся на обозначениях прав доступа и обозначениях файлов/каталогов. Первый символ:
d – файл является каталогом;
b – файл является специальным блочным файлом;
c – файл является специальным символьным файлом;
p – файл является именованным каналом;
– – обычный файл.
Далее следуют три группы символов, обозначающих права доступа – r (read), w (write), x (execute) – чтение, запись в файл/каталог и выполнение соответственно. Тема прав доступа в UNIX весьма обширна, поэтому сейчас не будем вдаваться в подробности.
Открыть для редактирования последний редактировавшийся файл:
# nano file1.txt
# nano file2.txt
# nano `ls -t | head -1`
Обычный вывод ls без ключей выводит все файлы/каталоги одной строкой. Что бы вывести их в колонку – выполняем:
# ls -1
Desktop
Downloads
Dropbox
file1.txt
file2.txt
Images
Soft
Temp
VirtualBox VMs
Ключ -h используется для вывода информации о размере в “человекоудобном” виде, т.е. в Kb, Mb, Gb :
# ls -lh
total 36K
drwxr-xr-x 2 setevoy setevoy 4.0K May 6 10:22 Desktop
drwxr-xr-x 2 setevoy setevoy 4.0K May 5 10:38 Downloads
drwx—— 16 setevoy setevoy 4.0K May 6 07:40 Dropbox
-rw-r–r– 1 root root 2 May 6 21:06 file1.txt
-rw-r–r– 1 root root 2 May 6 21:06 file2.txt
drwxr-xr-x 2 setevoy setevoy 4.0K May 5 12:00 Images
drwxr-xr-x 2 setevoy setevoy 4.0K May 5 18:29 Soft
drwxrwxr-x 2 setevoy setevoy 4.0K May 5 20:15 Temp
drwxrwxr-x 4 setevoy setevoy 4.0K May 5 19:09 VirtualBox VMs
Отсортировать файлы/каталоги по их размеру, начиная с самого большого:
# ls -lS /var/log/
total 4152
-rw-r–r– 1 root root 1823273 May 6 19:46 dpkg.log
-rw-r—– 1 syslog adm 825505 May 6 08:05 syslog.1
-rw-r—– 1 syslog adm 589203 May 6 19:25 kern.log
-rw-r–r– 1 root root 47105 Aug 23 2012 bootstrap.log
-rw-r–r– 1 root root 37440 May 6 19:46 aptitude
-rw-r–r– 1 root root 20584 May 6 07:39 pm-powersave.log
-rw-r—– 1 root adm 14329 May 5 11:38 dmesg.1.gz
-rw-r–r– 1 root root 6167 May 6 07:39 kdm.log
drwxr-xr-x 2 root root 4096 May 5 10:25 apt
-rw-r—– 1 root adm 31 Aug 23 2012 boot
-rw-r—– 1 syslog adm 0 May 5 10:38 ufw.log
Осотрировать файлы/каталоги по дате последней модификации, новые – в конце списка:
# ls -rtl /var/log/
total 4152
drwx—— 2 speech-dispatcher root 4096 Feb 6 2012 speech-dispatcher
drwxr-xr-x 2 root root 4096 Mar 12 2012 unattended-upgrades
…
drwxr-xr-x 2 root root 4096 Aug 10 2012 dist-upgrade
…
-rw-r–r– 1 root root 47105 Aug 23 2012 bootstrap.log
…
-rw-r–r– 1 root root 2990 May 5 19:20 fontconfig.log
…
-rw-r—– 1 syslog adm 60874 May 6 21:14 syslog
Что бы вывести новые в начале списка – используйте комбинацию опций без ключа -r :
То же самое, но сортировать по дате последнего доступа к файлу, а не дате его модификации, используйте ключ -u :
Вывести список файлов/каталогов, разделённый на 5 колонок, разделённых на всю ширину окна:
# ls /usr/local | pr -T5 -W$COLUMNS
bin games lib sbin src
etc include man share
Добавлять символ обозначения принадлежности файла/каталога – каталог ( / ), исполняемый файл ( * ), FIFO ( | ), символьная ссылка ( @ ), сокеты семейства AF_UNIX ( = ):
# ls -F -1
Desktop/
Downloads/
Dropbox/
file1
file1.txt
file2
file2.txt
file3
[email protected]
Images/
Soft/
Temp/
VirtualBox VMs/
Впрочем, ту же информацию выводит и ls -l – первый символ d для каталогов (directory) и -> ; для ссылок:
# ls -l
total 36
drwxr-xr-x 2 setevoy setevoy 4096 May 6 10:22 Desktop
…
lrwxrwxrwx 1 root root 9 May 6 21:20 file4.txt -> file1.txt
Выводить список через запятую:
# ls -m
Desktop, Downloads, Dropbox, file1, file1.txt, file2, file2.txt, file3, file4.txt, Images, Soft, Temp, VirtualBox VMs
Вывести список рекурсивно, включая подкаталоги и их содержимое:
# ls -R
.:
Desktop
Downloads
Dropbox
Images
Soft
Temp
VirtualBox VMs
./Desktop:
PDF-Viewer.desktop
PDF-Viewer.lnk
Остортировать файлы/каталоги в обратном алфавитном порядке:
# ls -r
VirtualBox VMs Temp Soft Images file4.txt file3 file2.txt file2 file1.txt file1 Dropbox Downloads Desktop
Вывести информацию о номерах inode файлов и каталогов:
# ls -i -1
2368762 Desktop
1969746 Downloads
1987155 Dropbox
1987223 file1
1969890 file1.txt
1987865 file2
1969805 file2.txt
1987866 file3
1987863 file4.txt
1969751 Images
2141585 Soft
2368300 Temp
2141811 VirtualBox VMs
Вывести информацию о пользователе/группе в виде UID и GID , вместо символьных имён:
# ls -n
total 36
drwxr-xr-x 2 1000 1000 4096 May 6 10:22 Desktop
drwxr-xr-x 2 1000 1000 4096 May 5 10:38 Downloads
drwx—— 16 1000 1000 4096 May 6 07:40 Dropbox
-rw-r–r– 1 0 0 0 May 6 21:10 file1
-rw-r–r– 1 0 0 2 May 6 21:06 file1.txt
-rw-r–r– 1 0 0 0 May 6 21:10 file2
-rw-r–r– 1 0 0 2 May 6 21:06 file2.txt
-rw-r–r– 1 0 0 0 May 6 21:10 file3
lrwxrwxrwx 1 0 0 9 May 6 21:20 file4.txt -> file1.txt
drwxr-xr-x 2 1000 1000 4096 May 5 12:00 Images
drwxr-xr-x 2 1000 1000 4096 May 5 18:29 Soft
drwxrwxr-x 2 1000 1000 4096 May 5 20:15 Temp
drwxrwxr-x 4 1000 1000 4096 May 5 19:09 VirtualBox VMs