Я пытаюсь найти стандартный способ POSIX для дублирования прав доступа одного файла к другому файлу. В системе GNU это легко:
[alexmchale@bullfrog ~]$ ls -l hardcopy.*
-rw-r--r-- 1 alexmchale users 2972 Jul 8 20:40 hardcopy.1
---------- 1 alexmchale users 2824 May 14 13:45 hardcopy.4
[alexmchale@bullfrog ~]$ chmod --reference=hardcopy.1 hardcopy.4
[alexmchale@bullfrog ~]$ ls -l hardcopy.*
-rw-r--r-- 1 alexmchale users 2972 Jul 8 20:40 hardcopy.1
-rw-r--r-- 1 alexmchale users 2824 May 14 13:45 hardcopy.4
К сожалению, флаг --reference для chmod является нестандартной опцией. Так что это для моих целей. Я бы предпочел, чтобы он был однострочным, но в этом нет необходимости. В конечном счете, он должен быть в синтаксисе POSIX sh.
command-line
unix
chmod
posix
Alex
источник
источник
cp has template
должна использоватьcp -p
для сохранения атрибутов режима и владельца.cp
если владелец / группа файла (например, «пользователь») отличается от того, кто выполняет копирование (например, root).cp -p
там.Вы можете использовать
stat
команду для получения разрешения на файл:Синтаксис Mac OS X (BSD):
Синтаксис Linux (не уверен):
` Символом является кавычка.
источник
stat
требуется POSIX. Это часто не доступно.Для этой цели могут использоваться утилиты ACL getfacl и setfacl , но я не знаю, достаточно ли это POSIX-совместимо. Работает по крайней мере во FreeBSD 8.0 и Linux, но с другой стороны, возможно, придется установить утилиты ACL.
С man-страницы:
Я думаю, что getfacl и setfacl могут работать со стандартными правами доступа к файлам в дополнение к ACL.
источник
cp -p
сохранит права доступа к файлам.источник
-p
) работает для того, что хочет OP, а именно для дублирования разрешений для другого файла, а не для дубликата файла.Один портативный, простой способ не является стандартной утилитой - вам нужно вызвать stat () для файла шаблона, а затем chmod () для файла (ов) назначения. Это означает использование языка, подобного C, или другого широко используемого языка, такого как perl.
Права доступа к файлу указываются в элементе struct stat st_mode битами 0007777. Решение Денниса правильное, если оно немного тяжелое для ввода-вывода, поэтому для действительно больших файлов оно может дать сбой:
Рассмотрим пример, не готовый к производству:
источник