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