Cómo cambiar el permiso y el propietario del grupo de un archivo al mismo tiempo

9

Para cambiar el permiso de archivo, sé que podría usar chmod. Para cambiar el propietario del grupo, podría usar chgrp. Sin embargo, si quiero cambiar tanto el permiso como el propietario al mismo tiempo, ¿algún comando que pueda usar en Linux?

Por ejemplo, hay un archivo con este permiso y propietario:

-rw-r--r--+  1 raymondtau  staff    0 May  8 16:38 WantToChangeThisFile

Y ahora quiero cambiarlo a:

---x-w--wx+  1 raymondtau  admin    0 May  8 16:38 WantToChangeThisFile

Sé que podría usar este comando: chmod 123 WantToChangeThisFile && chgrp admin WantToChangeThisFilepero quiero saber si hay alguna forma clara de hacerlo.

Raymond Tau
fuente

Respuestas:

9

Hay un concepto conocido como "UNIX-way". Cada herramienta debe realizar una función simple. Si uno necesita una función más compleja, puede combinar herramientas más pequeñas.

Lo opuesto es el diseño monolítico cuando toda la funcionalidad se agrega dentro de una herramienta enorme.

Si quieres hacer algo complejo, solo escribe un script, invocando herramientas simples.

Kondybas
fuente
Aquí es un guión que escribí que combina estas herramientas en una función de shell, ch.
Keith
2
no hay forma de que sea una respuesta, lo que pidió podría lograrse con varias herramientas ya existentes, como rsync y, aunque Linux tiende a preferir una herramienta / una función, significa que las herramientas que hacen varias cosas no existen
Kiwy
@Kiwy Algunas herramientas de Linux no se ajustan a los principios de una sola vía y combinan diferentes funciones de diferente naturaleza. Como systemd por ejemplo.
Kondybas
1
@Kondybas "tiende a" es la parte importante de la oración. La excepción a la regla existe. Aún así, tu respuesta para mí es realmente mala.
Kiwy
9

Si lo que también desea es copiar el archivo en algún lugar (como su destino final), es posible que desee ver el installcomando:

install -m 0777 -o root $sourcefile $destinationfile

Konrad Gajewski
fuente
1

Usar la herramienta adecuada para el trabajo en * nix es importante, pero de hecho, repetir la misma ruta en cada comando encadenado parece una tontería. En cambio, realmente debería usar variables Bash, y en scripts más pequeños, especialmente hacer uso de $_.

Su comando se convertiría en:

chmod 123 WantToChangeThisFile && chgrp admin $_

ALT +. hace lo mismo al extraer el último argumento utilizado en su shell actual.

Zebouski
fuente
0

Rsync es útil en este caso:

Del manual fino (TM)

--chown = USER: GROUP nombre de usuario simple / asignación de nombre de grupo

--chmod = CHMOD afecta los permisos de archivo y / o directorio

Entonces, por ejemplo, desea chmod / mnt / lala / lala4000 / "ugo = rX" y chown "foo.bar"

rsync --chmod = ugo = rX --chown = foo: bar -rvtpolgh / mnt / lala / lala4000 / / mnt / lala / lala4000 /

Esto recursivamente chown y chmod el directorio.

purpaboo
fuente
0

Podrías alcanzar un objetivo con un rsynccomando largo

rsync -a --chown=root:root --chmod=F755 filename filename
vern
fuente
no lo entiendo
Pierre.Vriens
Esto no es seguro: afectará a todos los archivos coincidentes en el directorio y subdirectorios especificados, no solo el archivo al que apunta.
telcoM
-1

Puedes hacer chown username:groupname file ...para cambiar ambos simultáneamente. Está cambiando dos campos en la misma estructura (inodo), por lo que al combinarlo se ahorran dos llamadas al sistema (una para leer los valores actuales y otra para configurar las variables modificadas).

wurtel
fuente
chownSolo cambia los propietarios. ¿Cómo cambia esto los permisos al mismo tiempo que OP solicitó? Nota El ejemplo de OP incluye chmodtambién a.
jscott
Ah, pensé que quería cambiar 3 cosas, mientras escribía. Para cambiar el propietario del grupo, pensé que se refería al grupo y al propietario.
wurtel
-3
#!/bin/bash

# Setting the Variables for execution
LOGDIR=$HOME
CURRENTTIME=$(date +"%Y%m%d%s%H%M%S")
LOGFILE=${LOGDIR}/chgpermission_${CURRENTTIME}.log
MASTERFILE=$1
INDEX=0

# Checking the number of Parameters passed
if [ "$#" -ne 1 ]; then
    echo "Master file name is mandatory parameter" > ${LOGFILE}
    exit 1
fi

# Loading the Master file into an Array 
echo "Loading the Master file ${MASTERFILE} into an array" >> ${LOGFILE}
while read line
do
#echo $line  
MASTERARRAY[$INDEX]=$HOME/$line 
INDEX=$(expr $INDEX + 1) 
done < ${MASTERFILE}

echo "Number of parameters in an master array ${MASTERARRAY[@]}" >> ${LOGFILE}

# Changing the permission of the file 
echo "Changing the permission of the file in master file ${MASTERFILE}" >> ${LOGFILE} 
index=0
for index in "${MASTERARRAY[@]}"
do
    if [ -f "$index" ] 
    then
       echo "$index file exist"
       echo  "$index file exist" >> ${LOGFILE}
       chmod 755 "$index" 
       chown workstation "$index"
       chgrp workstation "$index" 
    else
      echo "$index file does not extst"
      echo "$index file does not exist" >> ${LOGFILE}  
    fi 
done 
shirish umredkar
fuente
2
al menos podría proporcionar una explicación de cómo funciona y cómo se supone que debe usarse (parámetros cuánto son ...)
Kiwy
2
Por favor, no solo pegue un código como respuesta.
Konrad Gajewski el
No es probable que comentar sea productivo; Esto es lo único que ha publicado este usuario, y ni siquiera han iniciado sesión desde entonces.
G-Man dice 'Restablecer a Monica' el