¿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?
¿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?
Respuestas:
En GNU / Linux chown
y chmod
tenga una --reference
opción
chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
--reference
parámetro de chmod
y chown
antes :).
En cualquier unix con utilidades GNU, como Linux (no integrado) o Cygwin, puede usar chmod --reference
ychown --reference
.
Si su sistema tiene ACL , pruebe los comandos de ACL getfacl
y setfacl
. Estos comandos difieren un poco de un sistema a otro, pero en muchos puede usar getfacl other_file | setfacl -bnM - file_to_change
para 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
Hice un comando bash basado en la respuesta de Matteo :)
Código:
chmod $( stat -f '%p' "$1" ) "${@:2}"
Uso:
cp-permissions <from> <to>...
${*: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
.
chmod "$(stat -c '%a' "$fromfile")" tofile
en GNU Coreutils, pero también podría usarlo --reference
en ese caso, ya que la stat
utilidad 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 "
Si no está utilizando un sistema con chmod / chown de GNU (que admite la --reference
opció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}
ls -l
salida, podría analizar la stat
salida.
stat
sintaxis * BSD aquí. Su chmod $(stat ...)
comando no funcionará porque %p
solo genera demasiada información para * BSD chmod
, use %Lp
para generar solo los bits u / g / o. Se requeriría algo un poco más elaborado para los bits fijos / setuid / setgid.
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 stat
no se encontraba. Sin embargo, eso podría ser un problema con mi configuración.
Esto funciona para mi:
cp -p --attributes-only <from> <to>