Clonar propiedad y permisos de otro archivo?

125

¿Hay un comando o indicador para clonar la propiedad y los permisos del usuario / grupo en un archivo de otro archivo? ¿Para hacer que los permisos y la propiedad sean exactamente los de otro archivo?

usuario394
fuente

Respuestas:

175

En GNU / Linux chowny chmodtenga una --referenceopción

chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
enzotib
fuente
1
¿Podría hacer referencia a esta respuesta (y probablemente citarla) como respuesta a mi pregunta: unix.stackexchange.com/questions/44253/… ? , Creo que será una gran adición y me encantaría encontrar votos positivos allí para ello.
Grzegorz Wierzowiecki
@GrzegorzWierzowiecki: probablemente esa pregunta debería cerrarse, pero es un poco diferente a esto y ya tiene respuestas, así que mejor no hago nada.
enzotib
Como desees y sugieras. Gracias por la ayuda, nunca he puesto atención al --referenceparámetro de chmody chownantes :).
Grzegorz Wierzowiecki
12

En cualquier unix con utilidades GNU, como Linux (no integrado) o Cygwin, puede usar chmod --referenceychown --reference .

Si su sistema tiene ACL , pruebe los comandos de ACL getfacly setfacl. Estos comandos difieren un poco de un sistema a otro, pero en muchos puede usar getfacl other_file | setfacl -bnM - file_to_changepara copiar los permisos. Esto no copia la propiedad; puede hacerlo analizando cuidadosamente ls -l other_file, suponiendo que no tiene nombres de usuario o grupo que contengan espacios en blanco.

LC_ALL=C ls -l other_file | {
  read -r permissions links user group stuff;
  chown -- "$user:$group" file_to_change
}
getfacl other_file | setfacl -bnM - file_to_change
Gilles
fuente
1
Debe tener ACL instalado y el sistema de archivos montado con ACL habilitado.
enzotib
2
@enzotib Al menos en Linux, las herramientas de ACL funcionarán para copiar permisos (pero no la propiedad) incluso si el sistema de archivos de origen y destino no admite ACL.
Gilles
7

Hice un comando bash basado en la respuesta de Matteo :)

Código:

chmod $( stat -f '%p' "$1" ) "${@:2}"

Uso:

cp-permissions <from> <to>...

mjlescano
fuente
55
Egad! ¿Dónde aprendiste a decir ${*:2}? ¡Nunca vuelvas a hacer eso! Eso fallará si alguno de los nombres de archivo contiene espacio (o pestañas). Utilizar "${@:2}". Además, use en "$1"lugar de solo $1.
G-Man
chmod "$(stat -c '%a' "$fromfile")" tofileen GNU Coreutils, pero también podría usarlo --referenceen ese caso, ya que la statutilidad CLI no es POSIX, incluso dice pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.htm, ls -l eso no lo cortará: "La salida de ls (con la opción -l y opciones relacionadas) contiene información que lógicamente podría ser utilizada por utilidades como chmod y touch para restaurar los archivos a un estado conocido. Sin embargo, esta información se presenta en un formato que esas utilidades no pueden usar directamente. se traduce fácilmente a un formato que puede usarse "
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
5

Si no está utilizando un sistema con chmod / chown de GNU (que admite la --referenceopción), podría intentar analizar la salida dels -l

Aquí un pequeño script para chmod(si tiene una vista que admite expresiones regulares extendidas, podrían escribirse de una manera mucho más legible ...)

#!/bin/sh

reference=$1
shift
files=$*

# strip the permissions (whith extended regexes could be more readable)
OWNER=$(ls -l ${reference} | sed -e "s/.\(...\).*/\1/"       | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*/\1/"    | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*/\1/" | sed -e "s/[-]//g" )

chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}

ACTUALIZACIÓN :

Esto es aún más fácil usando stat:

chmod $( stat -f '%p' ${reference} ) ${files}
Matteo
fuente
2
En lugar de analizar la ls -lsalida, podría analizar la statsalida.
jfg956
@jfgagne: gracias tiene sentido No sé por qué no lo pensé en primer lugar. Actualicé la respuesta
Matteo el
1
Estás usando la statsintaxis * BSD aquí. Su chmod $(stat ...)comando no funcionará porque %psolo genera demasiada información para * BSD chmod, use %Lppara generar solo los bits u / g / o. Se requeriría algo un poco más elaborado para los bits fijos / setuid / setgid.
Sr.Spuratic
0

Quería agregar un ajuste al guión de Matteo . Se debe usar un bucle for para validar que los archivos existen antes de ejecutar realmente el comando chmod en ellos. Esto permitirá que el error del script salga con más gracia.

Creo que esta es la mejor opción porque se puede usar para todos los sistemas operativos * nix, como Solaris, Linux, etc.

#!/bin/sh

reference=$1
shift
files=$*

for file in $reference $files; do
  [ -f $file ] || { echo "$file does not exist"; exit 1; }
done

# strip the permissions (whith extended regexes could be more readable)
OWNER=$(ls -l ${reference} | sed -e "s/.\(...\).*/\1/" | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*/\1/" | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*/\1/" | sed -e "s/[-]//g" )

chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}

Descubrí que en una de mis máquinas Solaris 10 statno se encontraba. Sin embargo, eso podría ser un problema con mi configuración.

David
fuente
0

Esto funciona para mi:

cp -p --attributes-only <from> <to>

usuario172554
fuente