Изменение имен и атрибутов файлов
Функции в этом разделе переименовывают, копируют, удаляют файлы, создают ссылки на них и задают их режимы (права доступа). Обычно в случае неудачи они сигнализируют об ошибке 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". Описание спецификаций режимов файлов см. в разделе Права доступа к файлам в Руководстве GNUCoreutils.
- Функция: 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