Глава 14. Работа с файлами
В предыдущей главе мы рассмотрели информацию, знание которой необходимо для эффективного использования Linux. Вы знаете, что каждая команда - это отдельная программа (выполняемый файл). Вы научились выполнять операции с файлами, изучая различные варианты применения команды Is для вывода на экран списка файлов.
В этой главе мы подробнее рассмотрим применение команд для операций с файлами и каталогами, в том числе для их копирования, удаления, перемещения и создания. В конце главы мы рассмотрим применение подстановочных символов, например звездочки, широко используемой в DOS и Windows.
Копирование и удаление файлов
Копирование и перемещение - наиболее распространенные файловые операции. Вам регулярно придется заниматься репликацией файлов на всем диске или их копированием на дискеты для создания резервных копий или передачи на другой компьютер самым дешевым сетевым методом -на своих двоих. Другая ситуация - поиск ненужных файлов, которые надо удалить с переполненного диска.
Копирование файлов
Любой, у кого есть хотя бы небольшой опыт работы в DOS или окне DOS системы Windows, знает, что перетаскивание файлов из окна в окно— не единственный способ их копирования. Команда DOS copy предоставляет дополнительные возможности - например, использование подстановочных символов, - которые могут ускорить, упростить процесс и сделать его более эффективным, чем в Диспетчере файлов или Проводнике.
В Linux для копирования применяется команда ср (/bin/cp).
Основные операции копирования
Безусловно, простейшее применение команды ср - копирование файла из одного каталога в другой или создание дубликата в том же каталоге. Например, чтобы создать копию файла ThisFile, поместив ее в том же каталоге под именем ThisFile-Acopy, необходимо ввести следующую команду:
$ ср ThisFile ThisFile-Acopy
Если теперь заглянуть в указанный каталог при помощи команды 1s -1, то в нем окажется два файла абсолютно одинакового объема, но с разными датами создания. Дата создания нового файла совпадет с датой копирования, первоначальный же останется неизменным. Изменение файлаThisFile-Acopy не затронет файл ThisFile.
Аналогично, можно копировать файл ThisFile в каталог /tmp (например, чтобы предоставить к нему доступ другому пользователю). Для этого воспользуйтесь следующей командой.
$ ср ThisFile /tmp
Если файл, копируемый в другой каталог, требуется еще и переименовать, следует ввести команду:
$ ср ThisFile /tmp/NewFileName
Не записывайте поверх существующего файла
Все дистрибутивы Linux имеют один существенный недостаток: при копировании файлов существует опасность записи копии поверх существующего файла, Предположим, у вас есть два файла- ThisF%le и NewFile. Если вы решите создать копию одного из них, введя команду
$ ср ThisFile NewFile
копия запишется поверх файла NewFile, что приведет к его утрате (если, конечно, вы не были настолько предусмотрительны, чтобы позаботиться о резервной копии).
Чтобы избежать неприятностей, вводите команду ср с флажком -i. В этом случае система потребует подтверждения копирования поверх существующего файла.
$ ср -i ThisFile NewFile
ср: overwrite 'ThisFile'?
Чтобы обезопасить себя от подобных неприятностей, создайте алиас (псевдоимя) команды ср следующей командой:
$ alias cp='cp -i
Теперь при каждом обращении к команде ср последняя автоматически будет превращаться в команду ср —i. Следовательно, будет выводиться предупреждение о-каждом случае копирования поверх существующего файла. Как показано в гл. 16, модифицированием файла . bashrc можно конфигурировать оболочку Bash так, чтобы указанный псевдоним устанавливался при каждом входе в систему. (Оболочка - программа, управляющая средой командной строки,)
Очень важно, чтобы при входе в систему по учетной записи суперпользователя (он же корневой пользователь) указанный псевдоним устанавливается автоматически, поскольку малейшая ошибка суперпользователя может иметь катастрофические последствия.
Копирование нескольких файлов одной командой
Одним из недостатков команды сору системы DOS является то, что в ней можно указать лишь одно имя файла или выражение. Например, по команде
$ copy file /temp
происходит копирование файла file в каталог / temp. Другой вариант: $ copy *.tsct /temp
В этом случае, в каталог /temp копируются все текстовые файлы из текущего каталога. Если необходимо скопировать три отдельных файла, придется вводить команду трижды. Для копирования всех текстовых и выполняемых (. ехе) файлов текущего каталога команду придется вводить дважды.
Команда ср из Linux в этом отношении несколько удобнее. В отличие от двойника из DOS, в команде ср можно указать более двух аргументов. При этом последний из них трактуется как адрес назначения, остальные - как имена копируемых файлов.
Рассмотрим пример. Предположим, нам надо скопировать файлы FileOne, FileTwo и FileThree из текущего каталога в каталог /trap. Естественно, это можно сделать, введя команду копирования трижды.
$ ср FileOne /tmp
$ ср FileTwo /tmp
$ ср FileThree /tmp
Можно упростить задачу, объединив три команды в одну. $ ср FileOne FileTwo FileThree /tmp
Аналогично, при копировании большого числа файлов можно указать несколько аргументов с подстановочными символами.
$ ср *.txt *.doc *.bak /tmp
В этом случае происходит копирование всех файлов, имена которых имеют одно из трех указанных расширений.
Примечание
Помните: при копировании нескольких файлов таким способом, последним аргументом должен быть каталог, поскольку нельзя копировать несколько файлов в один. Нарушение этого условия приводит к выводу сообщения об ошибке следующего вида:
ср: when copying multiple files, last argument must be a directory. Try 'cp —help'for more information. (При копировании нескольких файлов последним надо указывать каталог. Для получения дополнительной информации введите 'ср --help'.)
Для копирования целого каталога со всеми подкаталогами введите команду ср с флажком -R. Если в текущем каталоге существует подкаталог SomeDir, то для рекурсивного копирования этого подкаталога (со всем его содержимым) в подкаталог / tmp воспользуйтесь следующей командой.
$ ср -R SomeDir /tmp
При копировании будет создан новый каталог /tmp/SomeDir, в который и будет скопировано содержимое исходного подкаталога SomeDir.
Дополнительные возможности
Команда ср предоставляет несколько дополнительных средств, увеличивающих возможности обычного копирования файлов и каталогов. Среди них - сохранение в копии состояния исходного файла и альтернативные методы защиты от копирования поверх существующего файла.
Обеспечение идентичности копии и оригинала
Внимательно присмотревшись к созданным копиям, нетрудно заметить, что некоторые их характеристики имеют мало общего с аналогичными характеристиками оригиналов. Среди этих характеристик - владелец файла, разрешения на доступ, дата и символические ссылки. Рассмотрим каждую из них подробно.
Владельцем копии файла обычно становится пользователь, выполнивший копирование, а не создатель файла-оригинала. Предположим, файл TheFile был создан пользователем userl и помещен в каталог /tmp, чтобы пользователь user2 смог копировать его оттуда в свой исходный каталог. В списке файлов этот файл выглядит примерно так:
-rw-r—r-- 1 userl users 16992 Apr 5 12:10 TheFile
После того, как пользователь user2 скопирует этот файл командой
$ ср /tmp/TheFile -/NewFile
он становится владельцем файла-копии.
-rw-rw-r-- I user2 users 16992 Apr 5 13:10 NewFile
Файлу, созданному в некотором каталоге, назначается набор разрешений по умолчанию. Но его копия наследует не эти разрешения, а разрешения, назначенные каталогу, в который выполнялось копирование. Обратите внимание на различия в разрешениях файла-оригинала и копии в приведенном примере. Если для оригинала определено разрешение только чтения группами пользователей, то для копии разрешена запись. Изменению подверглась и дата. В копии она совпадает со временем копирования, а с датой оригинала.
Иногда в копии необходимо сохранить все атрибуты файла-оригинала. Предположим, что корневой пользователь создает на съемном диске резервную копию некоторого набора файлов. В отличие от обычного архивирования на магнитную ленту, требующего других средств, в этом случае можно воспользоваться командой ср. Но резервные копии должны полностью соответствовать оригиналам. Самое время вспомнить о флажке -р, установка которого позволяет сохранить в копии все атрибуты оригинала. Если, возвращаясь к предыдущему примеру, вести команду
$ ср -р /tmp/TheFile
копия будет неотличима от оригинала:
-rw-r--r-- I userl users 16992 Apr 5 12:10 TheFile
Еще одна проблема, связанная с копированием файлов - копирование символических ссылок. Как было сказано в предыдущей главе, символическая ссылка - это указатель на файл из другого каталога. При помощи логических ссылок создается ситуация, при которой файл находится как бы одновременно в нескольких местах. При обращении к ссылке происходит фактически обращение к файлу, на который она указывает.
При обычном копировании символической ссылки происходит копирование не ее самой, ,а файла, на который она указывает. Например, если бы в предыдущем примере TheFile было именем символической ссылки:
Irwxrwxrwx 1 userl users 16992 Apr 5 12:10 TheFile OtherFile
то результат ввода команды
$ ср /tmp/TheFile -/NewFile
был бы следующим:
-rw-rw-r-- 1 user2 users 16992 Apr 5 13:10 NewFile
Но что. делать, если надо копировать ссылку, а не файл, на который она указывает, чтобы результат выглядел, как в следующем примере?
Irwxrwxrwx 1 user2 users 2 Apr 5 13:10 NewFile /tmp/OtherFile
В команде ср для этого предусмотрен флажок. Флажок -d отменяет разыменование ссылки. Команда копирования принимает вид:
S ср -d /tmp/TheFile -/NewFile
Попробуем подытожить сказанное. Как создать командой ср резервную копию существующего каталога со всеми подкаталогами? Это можно сделать при помощи сочетания двух рассмотренных флажков и рекурсивного копирования. Например, по команде
$ ср -pdR TheDirectory /backups
создается точная копия каталога TheDirectory в каталоге /backups /TheDirectory.
$ ср -a. TheDirectory /backups
Предотвращение ошибок
Мы рассмотрели один метод предотвращения ошибок - использование флажка -i, устанавли- каталогов. Существуют и другие методы установки разных степеней защиты.
Один из них - установка флажка -Ь для создания резервных копий файлов и каталогов, поверх КОТОРЫХ производится копирование. По умолчанию резервной копии присваивается имя файла- оригинала с добавленным в конце знаком тильды (~). Таким образом, если воспользоваться командой
$ ср -b FileOne FileTwo
для копирования файла FileOne в существующий файл FileTwo, будет создана резер'вная копия последнего с именем FileTwo-.
Правило присвоения имен резервным копиям можно изменять установкой флажка -S или. Флажок -S служит для замены тильды в конце имени резервной копии другим символом. Например, по команде
$ ср -b -S _ FileOne FileTwo
резервной копии файла FileTwo будет присвоено имя FileTwo_.
Флажок — backup позволяет выбрать одну из трех возможных схем присвоения имен.
Например, чтобы в рассмотренном примере была создана нумерованная резервная копия, необходимо ввести команду
$ ср — backup= t FileOne FileTwo или
$ ср -backup=numbered FileOne FileTwo
Аналогично, вводом команды
$ ср -backup=never FileOne FileTwo и
$ ср --backup=simple FileOne FileTwo
создаются обычные резервные копии.
Флажок -b в Red Hat Linux 7.1 с этими опциями не работает.
Примечание
В Red Hat Linux 7.1 по-прежнему можно использовать флажок -v для управления схемой присвоения имен. Однако в будущих версиях ср этот флажок уже будет недоступен.
Альтернативные формы флажков
Вероятно, вы обратили внимание на разнообразие флажков команды ср, в котором нетрудно запутаться. К счастью, для каждого флажка предусмотрена длинная, но легко запоминаемая формаг
Краткая форма | Длинная форма |
-I |
— interactive (интерактивное) |
-R |
--recursive (рекурсивное) |
-Р |
— preserve (предохранить) |
-а |
— no-dereference (без разыменования) |
-а |
— archive (архивное) |
-Ь |
— backup (резервное) |
-S |
--suffix (суффикс) |
Длинные формы флажков более наглядны, но со временем пользователи Linux привыкают к кратким, не требующим набора длинных строк. Рассмотрим команду
$ ср -i -Ь -V simple -S _ -R ThisDir /tmp
Эта же команда с длинными флажками:
$ ср --interactive —backup --version-control simple --suffix _
-> —recursive ThisDir /tmp
Безусловно, вторая команда более удобочитаема, но кто же возьмется набрать такое на клавиатуре!
Удаление файлов
Конечно же, Linux предоставляет не менее надежное средство удаления файлов. Это команда rm с соответствующим выполняемым файлом /bin/rm.
В простейшей форме команда применяется для удаления одного или нескольких файлов из текущего каталога. Командой
$ rm ThisFile
из текущего каталога удаляется файл ThisFile. Если из текущего каталога надо удалить все текстовые файлы, введите следующую команду.
$ rm *.txt
Подобно команде копирования, rm может иметь несколько аргументов. Например, две предыдущие команды можно заменить одной.
$ rm ThisFile *.txt
Как и команда копирования, rm несет в себе не только удобство, но и опасность. Нетрудно представить последствия случайного ввода команды
$ rm thesis.doc
вместо
$ rm thesis. bak
Как бы невероятным ни казался этот кошмар, он случается сплошь и рядом, принося массу ненужной работы и головную боль.
Чтобы избежать этого, установите в команде rm флажок -i, известный нам по команде ср, для вывода предупреждений об удалении файлов.
$ rm -i thesis.doc
rm: remove 'thesis.doc'?
Можно также создать псевдоимя команды rm, обеспечив вывод предупреждений по умолчанию.
$ alias rm='rm-i'
Удаление каталогов
Пользователям часто приходится удалять целиком каталоги. Предположим, у вас есть каталог, созданный в результате разархивирования файла, загруженного из Internet. После установки и тестирования программы, содержавшейся в загруженном файле, вы решите этот каталог удалить, для чего в команде rm необходимо установить флажок -r. Например, команда удаления каталога
$ rm -r Templnstall
Помнится, вы определили псевдоимя команды rm для вывода предупреждений об удалении файлов. При удалении больших каталогов это может оказаться некстати.
$ rm -r Templnstall
rm: descend directory 'templnstall'? у
rm: remove v TempInstall/File1'? у
rm: remove 'Templnstall/File2'? у
rm: remove directory 'Templnstall'? у
Представьте, что вам предстоит удалить несколько сот файлов. Невыполнимая задача. Для этих случаев предусмотрен флажок -f . Если вы уверены, что при удалении всего каталога не удалите ничего лишнего, отмените вывод предупреждений об удалении, установив в команде rm флажок -f.
$ rm -rf Templnstall
Напоминание
К использованию флажка -f следует относиться осторожно. Это средство не только мощное, но и опасное.
Учетная запись суперпользователя конфигурирована с установкой алиаса (псевдоимени) команды rm по умолчанию rm -i. Эта установка очень важна, поскольку малейшая ошибка суперпользователя может иметь катастрофические последствия для системы. Нетрудно догадаться чтo произойдет, если при попытке удалить каталог /tmp между "/" и "tmp" каким-то образом окажется пробел.
$ rm -r / tmp
Это команда удаления всех файлов и каталогов диска. И еще одно подтверждение важности алиаса команды rm -i.
Естественно, использование флажка - f требует от суперпользователя большой осторожности, да и само использование учетной записи суперполъзователя следует свести к минимуму. В конце концов, команда
$ rm -rf / tmp
опасна даже при наличии нужного алиаса.
Перемещение и переименование файлов
Перемещение и переименование файлов - операции родственные, поэтому мы рассмртрим их в одном параграфе. В отличие от систем DOS/Windows и Macintosh, где эти операции вполне независимы, в Linux переименование файлов рассматривается как частный случай перемещения.
Основная операция перемещения
Рассмотрим основную операцию перемещения.
$ mv FlleOne /tmp
По этой команде файл FileOne перемещается в каталог /trap.
Перемещение и переименование
Одновременно с перемещением в каталог /tmp, файл можно переименовать, воспользовавшись следующей командой.
$ mv FileOne /tmp/NewFileName
Отсюда следует, что для переименования файла достаточно переместить его в собственный каталог с новым именем.
$ mv FileOne NewFileName
Как видим, перемещение и переименование - одна и та же операция.
Перемещение нескольких файлов
Перемещение, как и копирование, может производиться сразу над несколькими файлами, поскольку в команде mv допустимо наличие более двух аргументов. В этом случае последний аргумент указывает каталог назначения (перемещать, как и копировать, несколько файлов в один нельзя). Рассмотрим ситуацию, в которой необходимо переместить в каталог /tmp все файлы текущего каталога с расширениями .bak, .tmp и .old. Воспользуемся командой
$ mv *.bak *.tmp *.old /tmp
По этой простой команде все файлы текущего каталога с расширениями . bak, .tmp и .old будут перемещены в каталог / tmp.
Командой mv можно перемещать целые каталоги, причем для этого не надо устанавливать флажки. Если в текущем каталоге есть подкаталог TheDir, который надо переместить в каталог / tmp, введите команду
$ mv TheDir//tmp
Аналогично, каталог TheDir превращается в подкаталог каталога NewDir:
$ mv TheDir/ /NewDir
Примечание
Как и для двух команд, рассмотренных выше, для команды mv необходимо установить алиас mv -i, чтобы предотвратить случайную запись перемещаемых файлов поверх уже .существующих. Для этого введите команду $ alias mv='mv -i'. В учетной записи суперпользователя такой алиас для команд ер, rm и mv установлен по умолчанию.
Создание файлов
Вы уже знаете несколько способов создания файлов. В операции копирования как раз это и происходит. Это же относится и к операции перемещения. Наконец, новый файл появляется при создании документа в текстовом редакторе, сохранении приложения сообщения электронной почты или создании копии экрана.
Но иногда требуется создать пустой файл нулевого объема. Пример такой ситуации - создание пустого файла сценарием для отметки особого состояния или прием программирования, называемый захватом файла (file locking). Суть его в следующем. Если сценарий открывает файл для внесения изменений, он одновременно создает специальный блокировочный файл (lock file). Блокировочный файл показывает другим программам и сценариям, что данный файл открыт для редактирования, а потому не может редактироваться другими программами или сценариями. Завершив редактирование файла и закрыв его, сценарий уничтожает блокировочный файл, вновь открывая доступ к отредактированному файлу.
Чтобы быстро и эффективно создавать блокировочные файлы, не выделяя значительный дисковый объем, нужен рациональный способ создания пустого файла. Для этого применяется команда touch. Например, по команде
$ touch NewFile
создается файл нулевого объема NewFile.
-rw-rw-r-- 1 armand armand 0 Apr 6 21:06 NewFile
Еще одно распространенное применение команды touch - изменение даты модификации существующего файла. Поведение многих программ определяется датами модификации файлов, с которыми они работают. Команда touch позволяет менять даты модификации файлов, не открывая и не редактируя их.
Создание каталогов
Каталоги относятся к числу специальных разновидностей файлов в Linux. Их специфика в том, что они содержат другие файлы. Для каталога вы можете установить такие ограничения на доступ, что другие пользователи даже не смогут посмотреть, какие файлы в нем содержатся Примерами каталогов может служить корневой каталог верхнего уровня (/) или ваш личный (домашний) каталог (например, /home/mj).
Но создать каталог той же командой, которой вы создаете файлы, нельзя. Для этого предусмотрены специальные команды mkdir и rmdir. Если вы хотите создать подкаталог для документов в вашем каталоге, можете воспользоваться следующей командой:
$ mkdir documents
Но эта команда не даст ожидаемого результата, если вы не находитесь в своем каталоге. Для пущей уверенности задайте полный путь создаваемого каталога:
$ mkdir /home/mj/documents
Будет ли эта команда работать или нет, зависит от предоставленных вам прав и доступности корневого каталога. К примеру, как рядовой пользователь вы, вероятно, не сможете создать новый каталог /golf, но корневому пользователю эта задача по силам.
Конечно, каталоги можно и удалять. Например, следующая команда удаляет созданный выше каталог:
$ rmdir /home/mj/documents
Будет ли эта команда работать, зависит от ваших прав для каталога /home/mj и от того, есть ли что-нибудь в этом каталоге. Конечно, можно использовать рассмотренную выше в этой главе команду rm -r для удаления непустого каталога.
Создание символических ссылок
Иногда приходится создавать не файлы, а символические ссылки. Символические ссылки - это указатели на реальные файлы в других каталогах. Обычно они используются системными администраторами и разработчиками прикладных программ. Представьте себе программиста, работающего над несколькими версиями одной программы. В конкретный момент времени тестирование проходит версия progS, progS или proglO - в зависимости от того, на какой стадии разработки находится проект. Чтобы гарантировать запуск для тестирования последней версии, можно создать на нее символическую ссылку prog. Каждый запуск prog будет приводить к запуску последней версии программы.
Есть два способа создания символических ссылок. Первый - ввод команды In с флажком -s, задающим создание символической ссылки, и двумя аргументами - файлом, на который указывает ссылка, и именем самой ссылки.
Например, чтобы создать в текущем каталоге ссылку МуСору на файл /bin/cp, введите следующую команду.
$ 1n -a /bin/ср МуСору
После этого команда 1s -1 покажет наличие символической ссылки.
1rwxrwxrwx 1 armand armand 7 Apr 6 22:50 МуСору -> /bin/cp
Несколько реже применяется другой способ создания символических ссылок - командой ср с флажком-s.
$ ср -8 /bin/cp МуСору
Краткое введение в подстановочные символы
Рассмотрим еще одну важную тему, посвященную подстановочным символам. Подробно она изложена в гл. 16 при изучении оболочки Unix, но поскольку мы уже неоднократно использовали эту технику, разумно будет сказать о ней несколько слов.
Подстановочные символы применяются для указания в одном компактном выражении имен нескольких файлов или каталогов. Мы уже неоднократно использовали звездочку (*), заменяющую любое число (включая нуль) произвольных символов. Например, выражение * . txt соответствует всем перечисленным ниже именам файлов.
По умолчанию богатый синтаксис применения подстановочных символов обеспечивает оболочка Bash. Эту оболочку нам еще предстоит рассмотреть, пока же рассмотрим несколько простейших подстановочных символов:
Что дальше
Итак, мы прошли изрядную часть пути. Теперь вы умеете работать с X Windows и начали постигать реальную глубину командной строки и оболочки Linux. Вы узнали о некоторых важных программах, запускаемых в среде командной строки, и научились сложным манипуляциям с файлами при помощи простых, но мощных команд.
В следующей главе мы научимся решать некоторые важные задачи конфигурирования и управления системой (в том числе конфигурирование принтеров, управление пользователями и т.д.) средствами утилиты LinuxConf и панели управления Linux Red Hat.