Анимация
JavaScript
|
Главная Библионтека (как и функция rename) не настолько умна, поэтому вы должны указывать полное имя файла явно. При создании жесткой ссылки старое имя не может быть именем каталога*, а новый псевдоним должен указывать на ту же файловую систему. (Эти ограничения частично обусловили необходимость создания символических ссылок.) В системах, которые поддерживают символические ссылки, в команде In может использоваться опция -s, которая создает символичесвсую ссылку. Например, если необходимо создать символическую ссылвсу из barney на neighbor (чтобы обращение к ие;/г6о/-фа1сгически было обращением к barney), следует использовать команду In -3 barney neighbor В Perl для этого применяется функция symlink: symlinkCbarney", "neighbor") II die "cannot symlink to neighbor"; Отметим, что barney не обязательно должен существовать - ни сейчас, ни в будущем. В этом случае обращение к neighbor возвратт нечто туманное вроде No such file or directory. Когда вы вызываете /s -I для каталога, содержащего символическую ссылку, вы получаете как имя этой ссылки, так и информацию о том, куда она указывает. В Perl эту же информацию можно получить с помощью функции readlink, которая по принципу работы удивительно похожа на системный вызов с тем же именем; она возвращает имя, на которое указывает заданная символическая ссылка. Так, в результате выполнения операции if (defined($x = readlink("neighbor"))) { print "neighbor points at $x\n"; вы получите сведения о barney, если все нормально. Если выбранная символическая ссылка не существует, не может быть прочитана или вообще не является таковой, readlink возвращает undef (т.е. в данном случае "ложь") - именно поэтому мы ее здесь и проверяем. В системах, не поддерживающих символические ссылки, обе функции - и symlink, и readlink - потерпят неудачу и выдадут сообщения об ощибке. Perl может "спрятать" от вас некоторые зависящие от конкретной системы особенности, но некоторые все равно проявляются. Это как раз одна из них. Если только вы не привелигированный пользователь и не любите забавляться с командой fsck, восстановливая поврежденную файловую систему. Создание и удаление каталогов Вы не смогли бы выполнить указанные операции (во всяком случае, в UNIX-системе), не зная о команде mkdir{\), которая создает каталоги, содержащие файлы и другие каталоги. В Perl есть эквивалент этой команды - функция mkdir, которая в качестве аргументов принимает имя нового каталога и некое число, определяющее права доступа к созданному каталогу. Права доступа задаются как число, интерпретируемое во внутреннем формате прав доступа. Если вы не знакомы с внутренним форматом прав доступа, обратитесь к man-странице chmod{2). Если вам некогда с этим разбираться, просто укажите права доступа как 0777, и все будет нормально*. Вот пример создания каталога с именем gravelpit: mkdir("gravelpit", 0777) [ die "cannot mkdir gravelpit: $ ! " ; UNIX-команда /-/лЛг( 1) удаляет пустые каталоги. В Perl есть ее эквивалент с тем же именем. Вот как можно сделать Фреда безработным: rmdir("gravelpit") die "cannot rmdir gravelpit: $!"; Хотя эти Perl-операции используют преимущества системных вызовов с такими же именами, они будут выполняться (хотя и чуточку медленнее) даже в системах, не поддерживающих такие вызовы. Perl вызывает утилиты mkdir и rmdir (или как там они называются у вас в системе) автоматически. Изменение прав доступа Права доступа к файлу или каталогу определяют, кто (в щироком смысле слова) и что может делать с этим файлом или каталогом. В UNIX общепринятый метод изменения прав доступа к файлу - применение команды chmod(\). (Если вы не знакомы с этой операцией, обратитесь к ее man-странице.) В Perl права доступа изменяются с помощью функции chmod. Эта функция получает в качестве аргументов заданный восьмеричным числом режим доступа и список имен файлов и пытается изменить права доступа ко всем этим файлам в соответствии с указанным режимом. Чтобы сделать файлы fred и barney доступными в режимах чтения и записи для всех пользователей, нужно выполнить такую операцию: chmod(0666,"fred","barney"); Режим 0 6 6 6 обозначает чтение и запись для владельца, группы и прочих пользователей, т.е. как раз то, что нам нужно. * в данно.м случае вы не создаете каталог с самыми широкими правами доступа. Определить права доступа вам также поможет текущая маска доступа umask вашего процесса. В UN1X-системах см. описание команды shell umask или man-страницу umask(2). 178 Иаупнсм PERL функция chmod возвращает число файлов, для которых были успешно изменены права доступа (даже если в результате фактически ничего не изменилось). Таким образом, в отношении контроля ошибок она работает аналогично функции unlink. Поэтому, чтобы изменить права доступа к файлам fred и barney и выполнить контроль ошибок в каждом случае, необходимо использовать следующую конструкцию: foreach $file ("fred","barney") { unless chmod (0666,$file) { warn "hmm... couldnt chmod $file.\$!"; Изменение принадлежности Каждый файл в файловой системе (обычный, каталог, файл устройства и т.д.) имеет владельца и группу. Эти параметры определяют, кому принадлежат права доступа, установленные для файла по категориям "владелец" и "группа" (чтение, запись и (или) выполнение). Владелец и группа определяются в момент создания файла, но при определенных обстоятельствах вы можете изменить их. (Эти обстоятельства зависят от конкретной разновидности UNIX, с которой вы работаете; подробности см. на man-странице chown.) Функция chown получает идентификатор пользователя (UID), идентификатор группы (GID) и список имен файлов и пытается изменить принадлежность каждого из перечисленных файлов в соответствии с указанными идентификаторами. Успешному результату соответствует ненулевое значение, равное числу файлов, принадлежность которых изменена (как в функциях chmod и unlink). Обратите внимание: вы одновременно меняете и владельца, и группу. Если какой-то из этих идентификаторов вы менять не хотите, поставьте вместо него -1. Помните, что нужно использовать числовые UID и GID, а не соответствующие символические имена (хотя команда chmod и принимает такие имена). Например, если UID файла fred - 1234, а идентификатор группы stoners, которой этот файл принадлежит по умолчанию,- 35, то в результате применения следующей команды файлы slate и granite переходят к пользователю fred и его группе: chown(1234, 35, "slate", "granite"); # то же, что и # chown fred slate granite # ohgrp stoners slate granite В главе 16 вы узнаете, как преобразовать fred в 1234 и stoners в 35. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 [ 56 ] 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |