20 сент. 2000 г.

Азы linux (для детей) урок 19

Управление файлами


Просмотр свойств файла

Дополнительная информация о ls

Помимо имени файла команда ls может дать много другой информации, например, тип файла (это мы уже обсуждали). Она может также показать права доступа к файлу, его размер, номер индексного дескриптора, дату и время создания, владельцев и количество ссылок на файл. Также использование ls вместе с опцией -a может отобразить файлы, обычно скрытые от глаз. Имена таких файлов начинается с точки. Типичный пример — это конфигурационные файлы в вашем домашнем каталоге. Когда вы проработаете в определенной системе некоторое время, то заметите, что были созданы десятки файлов и каталогов, that are not automatically listed in a directory index. Наряду с этим, каждый каталог содержит файл, именуемый просто точкой (.) и один с двумя точками (..), которые используются в сочетании с номером их индексного дескриптора для определения расположения каталога в древовидной структуре файловой системы.
Вам действительно следует прочитать страницы info о команде ls, так как это часто используемая команда с большим количеством полезных опций. Опции могут быть скомбинированы, как и в случае с большинством команд UNIX и их параметрами. Часто используемая комбинация ls -al; она отображает длинный список файлов и их свойств, а также пути, на которые указывают символические ссылки. ls -latr отображает те же файлы, только теперь в обратном порядке по признаку последнего изменения, так что файл, измененный в самое последнее время, находится в нижней части списка. Вот несколько примеров:
krissie:~/mp3> ls
Albums/  Radio/  Singles/  gene/  index.html

krissie:~/mp3> ls -a
./   .thumbs  Radio     gene/
../  Albums/  Singles/  index.html

krissie:~/mp3> ls -l Radio/
total 8
drwxr-xr-x    2 krissie krissie  4096 Oct 30  1999 Carolina/
drwxr-xr-x    2 krissie krissie  4096 Sep 24  1999 Slashdot/

krissie:~/mp3> ls -ld Radio/
drwxr-xr-x    4 krissie krissie  4096 Oct 30  1999 Radio/

krissie:~/mp3> ls -ltr
total 20
drwxr-xr-x    4 krissie krissie  4096 Oct 30  1999 Radio/
-rw-r--r--    1 krissie krissie   453 Jan  7  2001 index.html
drwxrwxr-x   30 krissie krissie  4096 Oct 20 17:32 Singles/
drwxr-xr-x    2 krissie krissie  4096 Dec  4 23:22 gene/
drwxrwxr-x   13 krissie krissie  4096 Dec 21 11:40 Albums/
В большинстве версий Linux ls является псевдонимом «цветного ls» по умолчанию. Это свойство позволяет увидеть тип файла без использования какой-либо опции ls. Для достижения этого каждому типу файла присваивается свой собственный цвет. Стандартная схема находится в /etc/DIR_COLORS:
Таблица 3.5. Цветовая схема color-ls по умолчанию
Цвет Тип файла
Голубой каталоги
Красный сжатые архивы
Белый текстовые файлы
Розовый изображения
Голубой ссылки
Желтый устройства
Зеленый исполняемые файлы
Мигающий красный неисправные ссылки
Больше информации найдется на man-странице. В прежние дни та же информация отображалась с помощью суффиксов для каждого имени нестандартного файла. При использовании моно-цвета (например, печати списка содержимого каталога) и для общей очевидности эта схема используется до сих пор:
Таблица 3.6. Схема суффиксов по умолчанию для команды ls
Символ Тип файла
Ничего Обычный файл
/ Каталог
* Исполняемый файл
@ Ссылка
= Сокет
| Именованный канал
Полное описание функциональности и особенностей команды ls можно узнать с помощью info coreutils ls.

Дополнительные инструменты

Чтобы узнать больше о типе данных, с которыми имеем дело, мы используем команду file. Применяя определенные тесты, которые проверяют свойства файла в файловой системе, «магические числа» и делают «лингвистические пробы», file пытается догадаться о формате файла. Вот некоторые примеры:
mike:~> file Documents/
Documents/: directory

mike:~> file high-tech-stats.pdf
high-tech-stats.pdf: PDF document, version 1.2

mike:~> file Nari-288.rm
Nari-288.rm: RealMedia file

mike:~> file bijlage10.sdw
bijlage10.sdw: Microsoft Office Document

mike:~> file logo.xcf
logo.xcf: GIMP XCF image data, version 0, 150 x 38, RGB Color

mike:~> file cv.txt
cv.txt: ISO-8859 text

mike:~> file image.png
image.png: PNG image data, 616 x 862, 8-bit grayscale, non-interlaced

mike:~> file figure
figure: ASCII text

mike:~> file me+tux.jpg
me+tux.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI),
            "28 Jun 1999", 144 x 144

mike:~> file 42.zip.gz
42.zip.gz: gzip compressed data, deflated, original filename,
         `42.zip', last modified: Thu Nov  1 23:45:39 2001, os: Unix

mike:~> file vi.gif
vi.gif: GIF image data, version 89a, 88 x 31

mike:~> file slide1
slide1: HTML document text

mike:~> file template.xls
template.xls: Microsoft Office Document

mike:~> file abook.ps
abook.ps: PostScript document text conforming at level 2.0

mike:~> file /dev/log
/dev/log: socket

mike:~> file /dev/hda
/dev/hda: block special (3/0)
Команда file имеет ряд опций, в частности -z, которая просматривает сжатые файлы. Чтобы получить более детальное описание, посмотрите info file. Имейте в виду, что результаты выполнения команды file не являются абсолютно достоверными, это только предположение. Другими словами, file может ошибиться.
Зачем весь этот шум о типах файлов и форматах?
В ближайшее время мы обсудим пару инструментов командной строки для просмотра текстовых файлов. Эти инструменты не будут работать при использовании «неправильного» типа файла. В худшем случае, они создадут аварийную ситуацию в вашем терминале и/или приведут к возникновению множества звуковых сигналов. Если у вас это случится, просто закройте сеанс терминала и начните новый. Но постарайтесь избегать этого, т.к. обычно это нервирует других людей.

Создание и удаление файлов и каталогов

Создание беспорядка...

... к этому легко придти. На сегодняшний день практически каждая система работает в сети, поэтому естественно файлы копируются с одного компьютера на другой. Особенно это происходит при работе в графической среде, где создание новых файлов часто происходит без согласия пользователя. Для иллюстрации этой проблемы здесь полное содержимое каталога нового пользователя, созданного на стандартной системе RedHat:
[newuser@blob user]$ ls -al
total 32
drwx------   3 user 	user        4096 Jan 16 13:32 .
drwxr-xr-x   6 root     root        4096 Jan 16 13:32 ..
-rw-r--r--   1 user 	user      24 Jan 16 13:32 .bash_logout
-rw-r--r--   1 user 	user     191 Jan 16 13:32 .bash_profile
-rw-r--r--   1 user 	user     124 Jan 16 13:32 .bashrc
drwxr-xr-x   3 user 	user    4096 Jan 16 13:32 .kde
-rw-r--r--   1 user 	user    3511 Jan 16 13:32 .screenrc
-rw-------   1 user 	user      61 Jan 16 13:32 .xauthDqztLr
Также на первый взгляд содержание "используемого" домашнего каталога не выглядит так плохо:
olduser:~> ls
app-defaults/ crossover/   Fvwm@     mp3/      OpenOffice.org638/
articles/     Desktop/     GNUstep/  Nautilus/ staroffice6.0/
bin/          Desktop1/    images/   nqc/      training/
brol/         desktoptest/ Machines@ ns_imap/  webstart/
C/            Documents/   mail/     nsmail/   xml/
closed/       Emacs@       Mail/     office52/ Xrootenv.0
Но если учесть все каталоги и файлы, начинающиеся с точки, то в данном каталоге уже обнаруживается 185 объектов. Причина этого в том, что у большинства приложений есть их собственные каталоги и/или файлы в домашнем каталоге этого пользователя, содержащие пользовательские настройки. Как правило, эти файлы создаются при первом запуске приложения. В некоторых случаях вы будете уведомлены, когда несуществующая директория должна быть создана, но по большей части все будет делаться автоматически.
К тому же новые файлы создаются, по-видимому, беспрерывно, потому что пользователи хотят сохранять файлы, хранить различные версии своих работ, использовать интернет-приложения, а также загружать файлы и сопутствующие материалы на их локальный компьютер. Это не остановить. Ясно одно, безусловно потребуются инструменты для сохранения порядка.
В следующем разделе мы обсудим имеющиеся средства для поддержания порядка. Мы только обсуждаем текстовые инструменты доступные в shell, поскольку графические инструменты интуитивны, выглядят и ощущаются также как известный метод «указать-и-щелкнуть» файлового менеджера MS Windows, в том числе графические функции помощи и другие свойства, которые вы ожидаете от такого рода приложений. Ниже приведен обзор наиболее популярных файловых менеджеров для GNU/Linux. Большинство файловых менеджеров могут быть запущены из меню вашей графической среды, щелчком по иконке домашнего каталога или из командной строки с помощью приведенных команд:
  • nautilus. Файловый менеджер Gnome (графической среды GNU) по умолчанию. Отличную документацию о работе с этим инструментом можно найти на http://www.gnome.org.
  • konqueror. Файловый менеджер, обычно используемый в графической среде KDE. Пособие есть на http://docs.kde.org.
  • mc. Midnight Commander, файловый менеджер Unix по образу Norton Commander. Вся документация доступна на http://gnu.org/directory/ или через зеркало, такое как http://www.ibiblio.org.
Несомненно эти приложения стоит попробовать, и они обычно впечатляют новичков Linux даже тем, что существует такой широкий выбор: это только самые популярные инструменты для управления каталогами и файлами, также многие другие проекты находятся в разработке. Теперь давайте выясним, что за всем этим стоит, и посмотрим, как эти графические инструменты используют стандартные команды UNIX.

Инструменты

Создание каталогов

Способ хранения объектов на своих местах - это помещение определенных файлов в специально для них созданные каталоги и подкаталоги (или, если хотите, папки и подпапки). Это делается с помощью команды mkdir:
richard:~> mkdir archive

richard:~> ls -ld archive
drwxrwxrwx  2 richard richard           4096 Jan 13 14:09 archive/
Создание каталогов и подкаталогов за один шаг делается с помощью опции -p:
richard:~> cd archive

richard:~/archive> mkdir 1999 2000 2001

richard:~/archive> ls
1999/  2000/  2001/

richard:~/archive> mkdir 2001/reports/Restaurants-Michelin/
mkdir: cannot create directory `2001/reports/Restaurants-Michelin/':
No such file or directory

richard:~/archive> mkdir -p 2001/reports/Restaurants-Michelin/

richard:~/archive> ls 2001/reports/
Restaurants-Michelin/
Если у нового файла должны быть другие права, чем те, что присваиваются по умолчанию при его создании, то новые права доступа могут быть установлены одним движением, также используя команду mkdir, см. страницы info для дополнительной информации. Мы собираемся обсудить режимы доступа в следующем разделе, посвященном безопасности файлов.
Имя каталога должно соответствовать тем же нормам, которые применяются для имен обычных файлов. Одним из наиболее важных ограничений является то, что у вас не может быть двух файлов с одинаковым названием в одном каталоге (но имейте в виду, операционная система Linux, как и UNIX, чувствительна к регистру). В сущности нет никаких ограничений на длину имени файла, но обычно оно содержит меньше, чем 80 символов, т. е. может поместиться в одной строке терминала. Вы можете использовать в имени файла любой символ, который вам захочется, хотя рекомендуется исключить символы, которые имеют специальное значение для оболочки. При сомнении сверьтесь с Приложением C, Особенности Shell.

Перемещение файлов

Теперь, когда мы должным образом создали структуру в нашем домашнем каталоге, настало время уборки «несекретных» файлов с использованием команды mv:
richard:~/archive> mv ../report[1-4].doc reports/Restaurants-Michelin/
Эта же команда используется для переименования файлов:
richard:~> ls To_Do
-rw-rw-r--    1 richard richard      2534 Jan 15 12:39 To_Do

richard:~> mv To_Do done

richard:~> ls -l done
-rw-rw-r--    1 richard richard      2534 Jan 15 12:39 done
Очевидно, что изменяется только имя файла. Все остальные свойства остаются неизменными.
Подробные сведения о синтаксисе и особенностях команды mv можно найти в man или info-страницах. Использование данной документации должно всегда быть вашим первым рефлексом при столкновении с проблемой. Вероятно ответ на ваш вопрос найдется в системной документации. Даже опытные пользователи читают man-страницы каждый день, поэтому начинающим пользователям следует читать их все время. Через некоторое время, вы узнаете, наиболее распространенные опции к часто используемым командам, но вам все равно будет нужна документация как основной источник информации. Обратите внимание, что информация, содержащаяся в HOWTO, FAQ, man-страницах и других источниках постепенно сливается на страницах info, которые на сегодняшний день являются наиболее современными источниками online-документации (также как и легко доступным в системе).

Копирование файлов

Копирование файлов и каталогов осуществляется с помощью команды cp. Есть полезная опция рекурсивного копирования (копирования всех файлов и подкаталогов), используйте опцию -R команды ср. Общий синтаксис
cp [-R] fromfile tofile
В качестве примера рассмотрим случай пользователя newguy, который захотелось иметь такие же настройки рабочего стола Gnome, какие есть у пользователя oldguy. Одним из способов решения проблемы является копирование настроек oldguy в домашний каталог newguy:
victor:~> cp -R ../oldguy/.gnome/ .
Это выдает некоторые ошибки, связанные с разрешением на файлы, но все эти ошибки связаны с личными файлами, в которых newguy в любом случае не нуждается. В следующем разделе мы обсудим, как изменить эти разрешения, если это действительно является проблемой.

Удаление файлов

Используйте команду rm для удаления отдельных файлов, rmdir для удаления пустых каталогов. (Используйте ls -a для проверки пуст каталог или нет). Команда rm также имеет опции для удаления непустых каталогов со всеми их подкаталогами, но об этих опасных опциях читайте, пожалуй, info-страницы.
Как пустота может быть каталогом?
Это нормально, что каталоги . (точка) и .. (точка-точка) не могут быть удалены, т.к. они также являются необходимыми в пустой директории для определения расположения каталогов в иерархии файловой системы.
В Linux, как и в UNIX, нет мусорных ящиков, по крайней мере, для shell, хотя есть множество решений для графического использования. Так однажды удаленный, файл действительно исчезает, и, как правило, уже нет возможности вернуть его обратно, кроме случаев, когда у вас есть резервные копии, или вы очень быстры и у вас действительно хороший системный администратор. Чтобы защитить начинающих пользователей от этой напасти, интерактивное поведение команд rm, cp и mv может быть запущено с помощью опции -i. В этом случае система не будет сразу действовать после запроса. Вместо этого, появится запрос на подтверждение, что потребует дополнительного нажатия клавиши Enter для причинения вреда:
mary:~> rm -ri archive/
rm: descend into directory `archive'? y
rm: descend into directory `archive/reports'? y
rm: remove directory `archive/reports'? y
rm: descend into directory `archive/backup'? y
rm: remove `archive/backup/sysbup200112.tar'? y
rm: remove directory `archive/backup'? y
rm: remove directory `archive'? Y
Мы обсудим, как сделать это опцией по умолчанию в Главе 7, «Дом сладкий /home», в которой обсуждается настройка окружения вашей оболочки.

Поиск файлов

Использование возможностей shell

В приведенном ранее примере перемещения файлов мы уже видели, как shell может манипулировать сразу несколькими файлами. В том примере оболочка автоматически понимает, что пользователь имел ввиду требованием между квадратными скобками "[" и "]". Оболочка может заменить диапазоны номеров, а также прописных или строчных буквы. Она также заменяет звездочку на любое количество символов и знак вопроса на любой один.
Все виды замещения могут быть использованы одновременно; оболочка очень последовательна в этом. Оболочка Bash, например, не имеет никаких проблем с такими выражениями как ls dirname/*/*/*[2-3].
В других оболочках, звездочка обычно используется, чтобы свести к минимуму усилия ввода: можно ввести cd dir* вместо cd directory. В Bash однако, это не является необходимым, поскольку у оболочки GNU есть свойство, называемое автозавершением имени файла. Это означает, что вы можете набрать первые несколько символов команды или файла (в текущем каталоге), и если никакой путаницы не может быть, оболочка поймет, что вы имеете в виду. Например, в каталоге, содержащем много файлов, вы можете проверить, если ли какие-нибудь файлы, начинающиеся с буквы A просто набрав ls A и нажать клавишу Tab дважды, вместо нажатия Enter. Если только один файл начинается с "А", то этот файл немедленно отобразится в качестве аргумента ls (или любой другой команды оболочки, если на то пошло).

Which

Самый простой способ просматривать файлы — это использование команды which для посмотра в каталогах, перечисленных в пути поиска пользователя на требуемый файл. Конечно, путь поиска содержит только пути к каталогам, содержащим исполняемые программы, которые не работают для обычных файлов. Команда which полезна при выяснении причины возникновения проблемы "Команда не найдена" ("Command not Found"). В приведенном ниже примере пользователь tina не может использовать программу acroread, а ее коллега не испытывает никаких проблем на той же системе. Эта проблема аналогична проблеме PATH из предыдущей части: коллега tina сказал ей, что он может увидеть нужную программу в /opt/acroread/bin, но этого каталога нет в ее path:
tina:~> which acroread
/usr/bin/which: no acroread in (/bin:/usr/bin:/usr/bin/X11
Проблема может быть решена путем предоставления полного пути к команде запуска, или нужно заново экспортировать содержание переменной PATH:
tina:~> export PATH=$PATH:/opt/acroread/bin

tina:~> echo $PATH
/bin:/usr/bin:/usr/bin/X11:/opt/acroread/bin
Используя команду which также можно проверить, является ли команда псевдонимом другой команды:
gerrit:~> which -a ls
ls is aliased to `ls -F --color=auto'
ls is /bin/ls
Если это не сработает в вашей системе, используйте псевдоним команды:
tille@www:~/mail$ alias ls
alias ls='ls —color'

Find и locate

Кроме перечисления в path, есть инструменты, специально предназначенные для поиска. Есть очень мощный инструмент find, известный из UNIX, который можно расценить, как имеющий достаточно трудный синтаксис. GNU find, однако, имеет дело с синтаксическими проблемами. Эта команда позволяет не только вести поиск имен файлов, она также может принимать размер файла, дату последнего изменения и другие свойства файла в качестве критериев для поиска. Наиболее часто используется поиск файлов по именам:

find <path> -name <searchstring>
Это может быть истолковано как "Просмотреть все файлы и подкаталоги, содержащихся в заданном пути, и выдать имена файлов, содержащих строку поиска в их имени" (но не в содержании).
Другое применение find поиск файлов по определенному размеру, как и в примере ниже, где пользователь peter хочет найти все файлы в текущей директории или одном из ее подкаталогов, которые больше 5 MB:
peter:~> find . -size +5000k
psychotic_chaos.mp3
Если вы покопаетесь в man-страницах, то увидите, что find также может совершать действия над найденными файлами. Типичным примером является удаление файлов. Лучше всего первый тест совершить без опции -exec, когда нужные файлы отобраны, после чего команда может быть повторно запущена для удаления выбранных файлов. Ниже, мы ищем файлы с расширением .tmp:
peter:~> find . -name "*.tmp" -exec rm {} \;

peter:~>
Оптимизация!
Эта команда будет вызывать rm так много раз, сколько подходящих к требованию файлов найдется. В худшем случае, это может быть тысячи или миллионы раз. Это довольно сильно загрузит вашу систему.
Более реалистичным подходом к работе будет использование канала (|) и инструмента xargs с командой rm в качестве аргумента. Таким образом, команда rm вызывается только, когда командная строка заполнена, а не для каждого файла. См. Главу 5, «Перенаправление ввода/вывода (I/O)» для дополнительной информации об использовании I/O перенаправления для облегчения повседневных задач.
Позднее (в 1999 году в след за man-страницами, после 20 лет существования find), была разработана locate. Эта программа проще в использовании, но более ограничена, чем find, т.к. ее выдача основана на базе данных файловых индексов, который обновляется только раз в день. С другой стороны, поиск в базе данных locate использует меньше ресурсов, чем find и, следовательно, показывает результаты практически мгновенно.
В наши дни большинство дистрибутивов Linux используют slocate (поиск снабженный безопасностью), современная версия locate позволяет пользователям получать выдачу, которую они не имеют права читать. Так, например, файлы из домашнего каталога root, обычно не доступны для публичного просмотра. Пользователь, который хочет найти того, кто знает об оболочке C, может задать команду locate .cshrc, для просмотра всех пользователей, у которых конфигурационный файл настроен на оболочку C. Если предположить, что пользователи root и jenny находятся под управлением оболочки C, то только файл /home/jenny/.cshrc будет отображен, и не один из домашней директории root. На большинстве систем, locate является символической ссылкой на программу slocate:
billy:~> ls -l /usr/bin/locate
lrwxrwxrwx 1 root slocate  7 Oct 28 14:18 /usr/bin/locate -> slocate*
Пользователь tina могла бы использоваться locate, чтобы найти необходимое приложение:
tina:~> locate acroread
/usr/share/icons/hicolor/16x16/apps/acroread.png
/usr/share/icons/hicolor/32x32/apps/acroread.png
/usr/share/icons/locolor/16x16/apps/acroread.png
/usr/share/icons/locolor/32x32/apps/acroread.png
/usr/local/bin/acroread
/usr/local/Acrobat4/Reader/intellinux/bin/acroread
/usr/local/Acrobat4/bin/acroread
Каталоги, которые не содержат имя bin
, не могут содержать программы - они не содержат исполняемые файлы. Есть три возможности. Файл в /usr/local/bin
и есть то, что хотела бы tina: это ссылка на shell-скрипт, который запускает настоящую программу:
tina:~> file /usr/local/bin/acroread
/usr/local/bin/acroread: symbolic link to ../Acrobat4/bin/acroread

tina:~> file /usr/local/Acrobat4/bin/acroread
/usr/local/Acrobat4/bin/acroread: Bourne shell script text executable

tina:~> file /usr/local/Acrobat4/Reader/intellinux/bin/acroread
/usr/local/Acrobat4/Reader/intellinux/bin/acroread: ELF 32-bit LSB 
executable, Intel 80386, version 1, dynamically linked (uses 
shared libs), not stripped
Для того, чтобы сохранить путь как можно короче, и системе не приходилось искать слишком долго каждый раз, когда пользователь хочет выполнить команду, мы добавляем /usr/local/bin
к пути, а не другие каталоги, которые содержат только двоичные файлы одной конкретной программы, также /usr/local/bin содержит другие полезные программы.
Опять же, полное описание возможностей find и locate можно найти на страницах info.

Команда grep

Общая строка фильтрации

Простая, но мощная программа grep используется для фильтрации входных строк и выдачи подходящих к образцу на вывод. Существуют буквально тысячи применений для программы grep. В приведенном ниже примере, jerry использует grep, чтобы посмотреть, что он делал с find:
jerry:~> grep -a find .bash_history
find . -name userinfo
man find
find ../ -name common.cfg
История поиска.
Также полезна в этих случаях функция поиска в bash, которая сразу же запускается нажатием Ctrl + R, как в примере, где мы хотим проверить еще раз, что мы делали в прошлом с командой find:
thomas ~> ^R 
(reverse-i-search)`find': find `/home/thomas` -name *.xml
Введите строку поиска для начала поиска. Чем больше символов вы вводите, тем более ограниченный поиск получаете. Здесь читается история команды для этой сессии оболочки (которая записывается в .bash_history в вашем домашнем каталоге при выходе из той сессии). Показывается самый последний случай строки вашего поиска. Если вы хотите увидеть предыдущие команды, содержащие ту же строку, нажмите Ctrl + R опять.
Чтобы узнать больше, изучайте info-страницы в bash.
Все ОС Unix имеют он-лайн словарь. Так же и Linux. Словарь представляет собой список известных слов в файле под названием words, расположенный в /usr/share/dict. Чтобы быстро проверить правильность написания слова, не графическое приложение, необходимо:
william:~> grep pinguin /usr/share/dict/words

william:~> grep penguin /usr/share/dict/words
penguin
penguins
Словарь против списка слов.
Некоторые дистрибутивы предлагают команду dict, которая предоставляет больше функций, чем просто поиск слов в списке.
Кто является владельцем того домашнего каталога рядом со мной? Эй, есть его номер телефона!
lisa:~> grep gdbruyne /etc/passwd
gdbruyne:x:981:981:Guy Debruyne, tel 203234:/home/gdbruyne:/bin/bash
И какой был адрес электронной почты Arno также?
serge:~/mail> grep -i arno *
sent-mail: To: 
sent-mail: On Mon, 24 Dec 2001, Arno.Hintjens@celeb.com wrote:
find и locate часто используются в сочетании с grep для решения некоторых важных задач. Для получения дополнительной информации см. Главу 5, «Перенаправление ввода/вывода (I/O)».

Специальные символы

Символы, имеющие специальное значение для оболочки должны быть экранированы. Символом экранирования в Bash является обратная косая черта, как и в большинстве оболочек; она придает специальное значение последующему символу. Оболочка знает о многих специальных символов, к числу наиболее распространенных относятся /,.,? и *. Полный список можно найти на info-страницах и документации к вашей оболочке.
Так, например, чтобы сказать, что вы хотите отобразить файл «*» вместо всех файлов в каталоге, вам придется использовать
less \*
То же самое касается имен файлов, содержащих пробел:
cat This\ File

Другие способы просмотра содержимого файла

Общее

Кроме cat, который действительно не делать больше, чем передача файлов на стандартный вывод, есть другие инструменты для просмотра содержимого файла.
Самый простой способ, конечно, будет заключаться в использовании графических инструментов вместо инструментов командной строки. Во введении мы уже мельком видели офисное приложение OpenOffice.org. Другие примеры GIMP (запускается командой gimp из командной строки), GNU программа обработки изображений; xpdf для просмотра файлов формата Portable Document (PDF); GhostView (gv) для просмотра файлов PostScript; браузер Mozilla/FireFox, Konqueror, Opera и многое другое для веб-контента; XMMS, CDplay и других для мультимедийных файлов, AbiWord, Gnumeric, KOffice и т.д. для всех видов офисных приложениях и т.д. Есть тысячи приложений Linux; перечисление их всех заняло бы дни.
Вместо этого мы продолжим сосредотачиваться на приложениях текстового режима, которые создают основу для всех других приложений. Эти команды работают лучше всего в текстовом окружении для файлов, содержащих текст. В случае сомнений, сначала проверьте с помощью команды file.
Итак, давайте посмотрим, какие текстовые инструменты у нас есть, которые полезны, для просмотра содержимого файлов.
Проблемы шрифта.
Инструменты для простого (плоского) текста, такие как те, что мы сейчас будем обсуждать, часто имеют проблемы с "плоскими" текстовыми файлами из-за кодировок шрифта, используемых в этих файлах. Специальные символы, такие как "акцентированные" буквы алфавита, китайские иероглифы и другие символы языков, использующих различные наборы символов, а не по умолчанию en_US кодировку и так далее, будут отображаться неправильно или будут заменены нечитаемым мусором. Эти проблемы обсуждаются в Разделе 7.4. "Региональные специфические настройки".

Меньше (less) значит больше

Несомненно рано или поздно вы услышите как кто-то скажет эту фразу при работе в среде UNIX. Немного истории UNIX объяснит это:
  • Сначала была cat. Поток вывода был неконтролируемым.
  • Потом была pg, которую все еще можно обнаружить на старых версиях Unix. Эта команда выдает текст на вывод по одной странице за раз.
  • Программа more подправленный вариант pg. Эта команда по-прежнему есть в каждой системе Linux.
  • less GNU версия more и включает дополнительные функции, позволяющие подсвечивать строки поиска, прокрутку назад и т.д. Синтаксис очень прост:
less name_of_file
Более подробная информация находится на info-страницах.
К настоящему времени вы уже знаете о пейджерах, поскольку они используются для просмотра man-страниц.

Команды head и tail

Эти две команды отображают соответственно n первых/последних строк файла. Чтобы посмотреть последние десять команд ввели следующее:
tony:~> tail -10 .bash_history 
locate configure | grep bin
man bash
cd
xawtv &
grep usable /usr/share/dict/words 
grep advisable /usr/share/dict/words 
info quota
man quota
echo $PATH
frm
head работает аналогично. У команды tail есть удобная функция, постоянно показывающая последние n строк файла, которые меняются все время. Это опция -f, которая часто используется системными администраторами для проверки файлов журналов. Более подробная информация находится в файлах системной документации.

Связывание файлов

Типы ссылок

Поскольку мы уже знаем достаточно о файлах и их представлении в файловой системе, понимание ссылок (или ярлыков) добавит составляющую в общую картину. Ссылка — это не более чем способ сопоставления двух или более имен файлов с одним и тем же набором данных. Есть два пути достижения этой цели:
  • Жесткая ссылка: Связывает два или более имени файла с одним и тем же индексным дескриптором. Жесткие ссылки определяют одни и те же блоки данных на жестком диске, в то время они продолжают вести себя как независимые файлы.
Существует очевидное неудобство: жесткие ссылки не могут распространяться на разделы, т.к. номера индексных дескрипторов уникальны только в пределах данного раздела.
  • Мягкая или символическая (символьная) ссылка (или для краткости: symlink - симлинк): маленький файл, который является указателем на другой файл. Символическая ссылка содержит путь к целевому файлу, а не указание на физическое расположение данных на жестком диске. Поскольку в данном механизме не задействованы индексные дескрипторы, мягкие ссылки могут существовать между разными разделами.
Поведение этих двух типов ссылок похожее, но не одинаковое, что проиллюстрировано на схеме ниже:
Рисунок 3.2. Механизм жестких и мягких ссылок
Механизм жестких и мягких ссылок в Linux
Обратите внимание, что удаление целевого файла для символьной ссылки делает ссылку бесполезной.
Каждый обычный файл, в принципе, - жесткая ссылка. Жесткие ссылки файла не простираются на все разделы, так как они отсылают к индексным дескрипторам, а номера ID уникальны только в пределах данного раздела.
Можно утверждать, что существует третий вид ссылок, user-space ссылки, которые похожи на ярлык в MS Windows. Это файлы, содержащие метаданные, которые могут быть интерпретированы только графическим файловым менеджером. Для ядра и оболочки это просто обычные файлы. У них может быть в конце суффикс .desktop или .lnk; например, можно найти ~/.gnome-desktop:
[dupont@boulot .gnome-desktop]$ cat La\ Maison\ Dupont
[Desktop Entry]
Encoding=Legacy-Mixed
Name=La Maison Dupont
Type=X-nautilus-home
X-Nautilus-Icon=temp-home
URL=file:///home/dupont
Этот пример взят из графической среды KDE:
[lena@venus Desktop]$ cat camera
[Desktop Entry]
Dev=/dev/sda1
FSType=auto
Icon=memory
MountPoint=/mnt/camera
Type=FSDevice
X-KDE-Dynamic-Device=true
Создать такого рода ссылку достаточно легко путем использования особенностей вашей графической среды. Если вам нужна помощь, то системная документация должна быть вашим первым источником.
В следующем разделе мы рассмотрим создание символических ссылок в UNIX-стиле с помощью командной строки.

Создание символических ссылок

Символическая ссылка представляет особый интерес для начинающих пользователей: они достаточно очевидны для понимания и вам не нужно беспокоиться о разделах.
Команды для создания ссылок является ln. Для того чтобы создать символические ссылки, следует использовать опцию -s:
ln -s targetfile linkname
В приведенном ниже примере пользователь freddy создает ссылку в подкаталоге своей домашней папки на каталог другой части системы:
freddy:~/music> ln -s /opt/mp3/Queen/ Queen

freddy:~/music> ls -l
lrwxrwxrwx  1 freddy  freddy  17 Jan 22 11:07 Queen -> /opt/mp3/Queen
Символические ссылки всегда очень маленькие файлы, в то время как жесткие ссылки имеют те же размеры, что и исходный файл.
Применение символических ссылок имеет широкое распространение. Они часто используются для экономии дискового пространства за счет создания «копии» файла для удовлетворения требований при установке новой программы, которая ожидает наличие файла в другом месте; они используются для исправления сценариев, которые внезапно запускаются в новых окружениях, в общем могут предотвратить большие затраты. Системный администратор может принять решение перенести домашние каталоги пользователей на новое место, disk2 например, но если он хочет, чтобы все работало, как раньше, в том числе файл /etc/passwd, с минимумом усилий он создаст символическую ссылку из /home на новое место /disk2/home.