Spec-Zone.ru › Elisp

Изменение имён и атрибутов файлов

Функции в этом разделе переименовывают, копируют, удаляют, создают ссылки и устанавливают режимы (разрешения) файлов. Обычно они сигнализируют об ошибке file-error при неудачном выполнении, сообщая зависящее от системы сообщение об ошибке, описывающее причину неудачи. Если они терпят неудачу из-за отсутствия файла, они сигнализируют об ошибке file-missing вместо этого.

Для повышения производительности операционная система может кэшировать или создавать псевдонимы для изменений, внесённых этими функциями, вместо немедленного их записи на вторичный носитель. См. Файлы и хранение.

В функциях, имеющих аргумент newname, если этот аргумент является именем каталога, он обрабатывается так, как будто к имени источника приложено некаталожное (файловое) имя. Обычно имя каталога — это имя, заканчивающееся на «/» (см. Имена каталогов). Например, если старое имя — a/b/c, то newname d/e/f/ обрабатывается так, как если бы это было d/e/f/c. Это специальное обращение не применяется, если newname не является именем каталога, а называет файл, являющийся каталогом; например, newname d/e/f остаётся неизменным, даже если d/e/f является каталогом.

В функциях, имеющих аргумент newname, если файл с именем newname уже существует, выполняемые действия зависят от значения аргумента ok-if-already-exists:

  • Сигнализируется об ошибке file-already-exists если ok-if-already-exists имеет значение nil.
  • Запрашивается подтверждение, если ok-if-already-exists — это число.
  • Старый файл заменяется без подтверждения, если ok-if-already-exists имеет любое другое значение.
Команда: add-name-to-file oldname newname &optional ok-if-already-exists

Эта функция добавляет файлу с именем oldname дополнительное имя newname. Это означает, что newname становится новой жёсткой ссылкой на oldname.

Если newname — это символическая ссылка, её запись в каталоге заменяется, а не запись в каталоге, на который она ссылается. Если oldname — символическая ссылка, эта функция может или не может следовать по ссылке; она не следует по ссылке на платформах GNU. Если oldname — каталог, эта функция, как правило, завершается неудачей, хотя для суперпользователя на некоторых старых не-GNU платформах она может иметь успех и создать файловую систему, которая не имеет древовидной структуры.

В первой части следующего примера мы перечислим два файла, foo и foo3.

$ ls -li fo*
81908 -rw-rw-rw- 1 rms rms 29 Aug 18 20:32 foo
84302 -rw-rw-rw- 1 rms rms 24 Aug 18 20:31 foo3

Теперь мы создаём жёсткую ссылку, вызвав add-name-to-file, затем снова перечислим файлы. Это покажет два имени для одного файла, foo и foo2.

(add-name-to-file "foo" "foo2")
     ⇒ nil
$ ls -li fo*
81908 -rw-rw-rw- 2 rms rms 29 Aug 18 20:32 foo
81908 -rw-rw-rw- 2 rms rms 29 Aug 18 20:32 foo2
84302 -rw-rw-rw- 1 rms rms 24 Aug 18 20:31 foo3

Наконец, мы вычислим следующее:

(add-name-to-file "foo" "foo3" t)

и снова перечислим файлы. Теперь есть три имени для одного файла: foo, foo2 и foo3. Старое содержимое foo3 теряется.

(add-name-to-file "foo1" "foo3")
     ⇒ nil
$ ls -li fo*
81908 -rw-rw-rw- 3 rms rms 29 Aug 18 20:32 foo
81908 -rw-rw-rw- 3 rms rms 29 Aug 18 20:32 foo2
81908 -rw-rw-rw- 3 rms rms 29 Aug 18 20:32 foo3

Эта функция не имеет смысла в операционных системах, где несколько имён для одного файла не допускаются. Некоторые системы реализуют несколько имён, копируя файл вместо этого.

См. также file-nlinks в Атрибутах файлов.

Команда: rename-file filename newname &optional ok-if-already-exists

Эта команда переименовывает файл filename как newname.

Если у filename есть дополнительные имена помимо filename, он продолжает иметь эти имена. На самом деле, добавление имени newname с add-name-to-file и последующее удаление filename имеет тот же эффект, что и переименование, за исключением кратковременных промежуточных состояний и обработки ошибок, каталогов и символических ссылок.

Эта команда не следует по символическим ссылкам. Если filename — символическая ссылка, эта команда переименовывает символическую ссылку, а не файл, на который она указывает. Если newname — символическая ссылка, её запись в каталоге заменяется, а не запись в каталоге, на который она ссылается.

Эта команда ничего не делает, если filename и newname — это та же запись в каталоге, т. е. если они ссылаются на тот же родительский каталог и имеют то же имя внутри этого каталога. В противном случае, если filename и newname называют один и тот же файл, эта команда ничего не делает в системах, соответствующих POSIX, и удаляет filename в некоторых не-POSIX системах.

Если newname существует, то это должен быть пустой каталог, если oldname является каталогом, и не-каталог в противном случае.

Команда: copy-file oldname newname &optional ok-if-already-exists time preserve-uid-gid preserve-extended-attributes

Эта команда копирует файл oldname в newname. Ошибка сигнализируется, если oldname не является обычным файлом. Если newname называет каталог, он копирует oldname в этот каталог, сохраняя его конечное имя компонента.

Эта функция следует по символическим ссылкам, за исключением случаев, когда она не следует по висящей символической ссылке для создания newname.

Если time не nil, то эта функция присваивает новому файлу то же время последнего изменения, что и у старого (это работает только в некоторых операционных системах). Если при установке времени возникает ошибка, copy-file сигнализирует об ошибке file-date-error. В интерактивном вызове префиксный аргумент указывает значение time, отличное от nil.

Если аргумент preserve-uid-gid равен nil, мы позволяем операционной системе решить вопрос о пользователе и группе-владельцах нового файла (обычно это пользователь, выполняющий Emacs). Если preserve-uid-gid не равен nil, мы пытаемся скопировать владельца и группу файла. Это работает только в некоторых операционных системах и только если у вас есть соответствующие разрешения.

Если необязательный аргумент preserve-permissions не равен nil, эта функция копирует режимы файла (или «разрешения») oldname в newname, а также список управления доступом и контекст SELinux (если есть). См. Информация о файлах.

В противном случае режимы файла newname остаются неизменными, если это существующий файл, и устанавливаются в режимы oldname, замаскированные стандартными разрешениями файла (см. set-default-file-modes ниже), если newname должен быть создан. Список управления доступом или контекст SELinux в обоих случаях не копируются.

Команда: make-symbolic-link target linkname &optional ok-if-already-exists

Эта команда создаёт символическую ссылку на target с именем linkname. Это похоже на командную строку оболочки «ln -s target linkname». Аргумент target обрабатывается только как строка; ему необязательно называть существующий файл. Если ok-if-already-exists — целое число, обозначающее интерактивное использование, тогда ведущие ‘~’ расширяются, а ведущие ‘/:’ удаляются в строке target.

Если target — относительное имя файла, полученная символическая ссылка интерпретируется относительно каталога, содержащего символическую ссылку. См. Относительные имена файлов.

Если у target и linkname есть синтаксис удалённого имени файла, и если оба удалённых идентификатора равны, то символическая ссылка указывает на часть локального имени файла target.

Эта функция недоступна в системах, которые не поддерживают символические ссылки.

Команда: delete-file filename &optional trash

Эта команда удаляет файл filename. Если у файла есть несколько имён, он по-прежнему существует под другими именами. Если filename — символическая ссылка, delete-file удаляет только символическую ссылку, а не её целевой объект.

Соответствующий тип ошибки file-error сигнализируется, если файл не существует или не может быть удалён. (В системах GNU и других системах, подобных POSIX, файл может быть удалён, если его каталог доступен для записи.)

Если необязательный аргумент trash не равен nil и переменная delete-by-moving-to-trash не равна nil, эта команда помещает файл в системную корзину вместо удаления. См. Различные операции с файлами в Справочнике GNU Emacs. При интерактивном вызове trash имеет значение t если префиксный аргумент не задан, и nil в противном случае.

См. также delete-directory в Создание/удаление каталогов.

Команда: set-file-modes filename mode &optional flag

Эта функция устанавливает режим файла (или разрешения) filename на mode.

По умолчанию эта функция следует по символическим ссылкам. Однако, если необязательный аргумент flag является символом nofollow, эта функция не следует по filename, если это символическая ссылка; это может помочь предотвратить непреднамеренное изменение битов режима файла в другом месте. В платформах, которые не поддерживают изменение битов режима символической ссылки, эта функция сигнализирует об ошибке, когда filename является символической ссылкой, а flag равен nofollow.

Если вызов неинтерактивный, mode должен быть целым числом. Используются только 12 младших битов целого числа; в большинстве систем только 9 младших битов имеют смысл. Можно использовать лисп-конструкцию для ввода восьмеричных чисел для mode. Например,

(set-file-modes "myfile" #o644 'nofollow)

указывается, что файл должен быть читаемым и записываемым для его владельца, читаемым для членов группы и читаемым для всех остальных пользователей. См. Разрешения файлов в Справочнике GNU Coreutils для описания спецификаций битов режима.

В интерактивном режиме mode считывается из минибуфера с помощью read-file-modes (см. ниже), что позволяет пользователю ввести целое число или строку, представляющую разрешения символически.

См. Проверка доступности для функции file-modes, которая возвращает разрешения файла.

Функция: set-default-file-modes mode

Эта функция устанавливает права доступа по умолчанию для новых файлов, создаваемых Emacs и его дочерними процессами. Каждый файл, созданный с помощью Emacs, изначально имеет эти права или подмножество их (write-region не будет предоставлять права на выполнение, даже если права доступа по умолчанию позволяют выполнение). В системах GNU и других системах, подобных POSIX, права доступа по умолчанию задаются битовым дополнением значения ‘umask’, т. е. каждый бит, установленный в аргументе mode, будет сброшен в правах доступа по умолчанию, с которыми Emacs создает файлы.

Аргумент mode должен быть целым числом, которое определяет права доступа, аналогично set-file-modes выше. Значимы только 9 младших битов.

Права доступа по умолчанию не влияют на сохранение изменённой версии существующего файла; сохранение файла сохраняет его существующие права.

Макрос: with-file-modes mode body…

Этот макрос вычисляет формы body с правами доступа по умолчанию для новых файлов, временно установленных на modes (значение которого такое же, как у set-file-modes выше). По завершении он восстанавливает исходные права доступа по умолчанию и возвращает значение последней формы в body.

Это полезно, например, для создания личных файлов.

Функция: default-file-modes

Эта функция возвращает права доступа по умолчанию в виде целого числа.

Функция: read-file-modes &optional prompt base-file

Эта функция считывает набор битов прав доступа к файлам из минибуфера. Первый необязательный аргумент prompt задаёт нестандартный приглашающий текст. Второй необязательный аргумент base-file — это имя файла, права которого должны использоваться в качестве основы для битов прав доступа, которые возвращает эта функция, если пользователь вводит значения, относящиеся к правам существующего файла.

Если входные данные пользователя представляют собой восьмеричное число, эта функция возвращает это число. Если это полное символьное описание битов прав доступа, как в "u=rwx", функция преобразует его в эквивалентное числовое значение с помощью file-modes-symbolic-to-number и возвращает результат. Если спецификация относительная, как в "o+g", права доступа, на которых основана спецификация, берутся из битов прав доступа файла base-file. Если base-file опущен или nil, функция использует 0 в качестве базовых битов прав доступа. Полные и относительные спецификации могут быть объединены, как в "u+r,g+rx,o+r,g-w". Смотрите Права доступа к файлам в Справочнике GNU Coreutils для описания спецификаций прав доступа к файлам.

Функция: file-modes-symbolic-to-number modes &optional base-modes

Эта функция преобразует символьное описание прав доступа к файлу в modes в эквивалентное целое число. Если символьное описание основано на существующем файле, биты прав доступа этого файла берутся из необязательного аргумента base-modes; если этот аргумент опущен или nil, по умолчанию используется 0, т. е. никаких прав доступа.

Функция: file-modes-number-to-symbolic modes

Эта функция преобразует числовое описание прав доступа к файлу в modes в эквивалентную символьную форму.

Функция: set-file-times filename &optional time flag

Эта функция устанавливает время доступа и изменения файла filename на time. Значение возврата — t, если время успешно установлено, в противном случае — nil. time по умолчанию устанавливается на текущее время и должно быть значением времени (см. Время суток).

По умолчанию эта функция следует символическим ссылкам. Однако, если необязательный аргумент flag является символом nofollow, эта функция не следует filename, если это символическая ссылка; это может помочь предотвратить непреднамеренное изменение времени файла в другом месте. В платформах, не поддерживающих изменение времени для символической ссылки, эта функция сигнализирует об ошибке, если filename является символической ссылкой, а flag — nofollow.

Функция: set-file-extended-attributes filename attribute-alist

Эта функция устанавливает распознаваемые Emacs расширенные атрибуты файла filename. Второй аргумент attribute-alist должен быть списком ассоциаций, имеющим тот же формат, что и возвращаемый file-extended-attributes. Значение возврата — t если атрибуты успешно установлены, иначе — nil. Смотрите Расширенные атрибуты.

Функция: set-file-selinux-context filename context

Эта функция устанавливает контекст безопасности SELinux для filename на context. Аргумент context должен быть списком (user role type range), где каждый элемент — строка. Смотрите Расширенные атрибуты.

Функция возвращает t, если она успешно устанавливает контекст SELinux для filename. Она возвращает nil, если контекст не был установлен (например, если SELinux отключен или Emacs был скомпилирован без поддержки SELinux).

Функция: set-file-acl filename acl

Эта функция устанавливает список управления доступом (ACL) для filename на acl. Аргумент acl должен иметь тот же формат, что и возвращаемый функцией file-acl. Смотрите Расширенные атрибуты.

Функция возвращает t, если она успешно устанавливает ACL для filename, nil в противном случае.

Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Changing-Files.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API