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, команда ничего не делает, а в некоторых системах, не соответствующих POSIX, удаляет filename.

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

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

Эта команда копирует файл 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 ниже). В обоих случаях список управления доступом и контекст 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 удаляет только символическую ссылку, а не ее цель.

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

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

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

Пользовательская опция: remote-file-name-inhibit-delete-by-moving-to-trash

Если эта переменная не равна nil, удаленные файлы никогда не перемещаются в корзину, а вместо этого удаляются.

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

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

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

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

(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 в эквивалентную строковую форму. Возвращаемая этой функцией строка имеет тот же формат, что и вывод команды оболочки ls -l и file-attributes, а не символьную форму, принимаемую file-modes-symbolic-to-number и командой оболочки chmod.

Функция: 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

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

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

Copyright © 1990-1996, 1998-2026 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