Несколько месяцев назад я провел тест поведения cp
, когда целевой файл уже существует:
$ ls -li
total 12
913966 -rw-rw-r-- 1 vagrant vagrant 30 Dec 16 20:26 file1
913965 -rwxrw---- 2 pete vagrant 39 Dec 16 20:35 file2
913965 -rwxrw---- 2 pete vagrant 39 Dec 16 20:35 hardlinktofile2
$ cat file1
This is the contents of file1
$ cat file2
This is the original contents of file2
$ cp file1 file2
$ ls -li
total 12
913966 -rw-rw-r-- 1 vagrant vagrant 30 Dec 16 20:26 file1
913965 -rwxrw---- 2 pete vagrant 30 Dec 16 20:37 file2
913965 -rwxrw---- 2 pete vagrant 30 Dec 16 20:37 hardlinktofile2
$ cat file1
This is the contents of file1
$ cat file2
This is the contents of file1
$
Как вы можете видеть, целевой файл перезаписывается на место и все его разрешения, права собственности, атрибуты и т.д. сохраняются - даже жесткие ссылки. Исходный файл никак на них не влияет.
Нет никакого смысла в том, чтобы mtime
сохранялось по умолчанию, и это не так. Но вы заметите, что новое mtime
для file2
не берется из file1
- оно берется из текущего системного времени.
Вы можете провести аналогичный тест, не имея уже существующего целевого файла, но этот тест на самом деле более наглядно иллюстрирует суть: Только фактическое содержимое файла копируется, когда не указаны никакие опции. Владение файлом, разрешения, ACL, mtime и т.д. не устанавливаются в соответствии с исходным файлом, а вместо этого устанавливаются таким же образом, как и для вновь созданного файла. (Так, разрешения в соответствии с umask
, mtime
в соответствии с текущим временем, право собственности в соответствии с EUID процесса cp
и т.д.)
Есть одно специфическое, но общее исключение:
При отсутствии [опции --preserve=] разрешения существующих файлов назначения не изменяются. Каждый новый файл создается с режимом соответствующего исходного файла за вычетом битов set-user-ID, set-group-ID и sticky в качестве режима создания. (Затем операционная система применяет либо umask, либо ACL по умолчанию, что, возможно, приводит к более ограничительному режиму файла).
Согласно info coreutils 'cp invocation'
:
`xattr' Сохранять расширенные атрибуты, если `cp' собран с поддержкой xattr и xattr поддерживаются и включены в вашей файловой системе. системе. Если контекст SELinux и/или ACL реализованы с использованием xattrs, они также будут сохранены этой опцией.
Это не указывает, что расширенные атрибуты сохраняются каким-либо другим способом, кроме как с помощью этого флага.
Важны не только разрешения, но также пользователь и группа. Вы должны заметить это из следующего вывода:
ls -ldZ ~username/ ~username/.ssh ~username/.ssh/authorized_keys
Это распространенная ошибка, особенно если вы создаете папки с помощью пользователя root
.