¿chmod y chown al mismo tiempo?

¿chmod y chown al mismo tiempo?

Tengo un script que estoy ejecutando para corregir la propiedad y los permisos de los archivos después de un rsync. Dejando a un lado las preguntas sobre la forma óptima de realizar mi tarea, me pregunto: ¿hay alguna forma de ejecutarlo chmody chownal mismo tiempo?

En la iteración actual de mi script, estoy findprocesando archivos dos veces.

find /var/www/mysite -exec chown  www-data:www-data {} \;
find /var/www/mysite -type f -exec chmod 775 {} \;

Pensé que sería bueno poder cambiar tanto los permisos como el propietario/grupo con un solo comando. Después de buscar en Google, me sorprendió saber que tal comando, argumento u opción no existe.

¿Puedo cambiar los permisos y la propiedad al mismo tiempo para evitar findtener que cambiar cada archivo dos veces?

EditarUna edición o publicación de la comunidad o algo sugirió que esta pregunta es un duplicado de"Cambiar todos los permisos de carpeta con 1 comando". Esta pregunta es diferente porque se refiere a cambiarambospermisosy propiedadal mismo tiempo, no sólo permisos.

Respuesta1

Puede pasar varios comandos ejecutivos:

find /var/www/mysite -exec chown www-data:www-data {} \; \
     -type f -exec chmod 775 {} \;

Respuesta2

Podrías agregar las opciones equivalentes a tu rsynccomando:

rsync <your_options> --chown www-data:www-data --chmod=F775 <source> <destination>

Puede utilizar el prefijo Fin --chmodpara archivos y Ddirectorios.

Respuesta3

Por completitudxargosTambién puede hacer todo tipo de cosas interesantes en tuberías.

find . -type f -print0 | xargs -0 -I VAR -- sh -c 'chmod 775 "VAR" && chown www-data:www-data "VAR" '

Esto produce una secuencia de nombres de archivos (no nombres de directorios) con valores nulos como separadores, por lo que se ocupa de los espacios en los nombres de archivos.

-0le dice a xargs que separe las entradas en el valor nulo.
-I VARdice usar VARcomo "nombre de variable" en lugar de {}
--y todo lo que sigue es lo que se debe ejecutar para cada línea

Esto puede ser más legible, pero iniciará un nuevo shell para cada ejecución del comando de doble cañón.

Respuesta4

Si le preocupa findprocesar cada archivo dos veces, es posible que también desee preocuparse por la cantidad de bifurcaciones que produciría la ejecución de una combinación de comandos a través de xargs.

La gente suele olvidar que Perl tiene equivalentes para muchos de estos comandos básicos del shell. Aquí hay una forma en que haría esto (probado):

find | perl -lne 'chown 1001,1001, $_; -d $_ ? chmod(0755, $_) : chmod(0644, $_)'

Tendrías que usar elnuméricouid, gid y mode, pero piensa en esto:esto no se bifurca en absoluto(más allá del uno findy del uno perl).

Y tampoco necesitas saber mucho de Perl para asimilarlo.

El chown y el chmod son bastante claros. -des el mismo que en el shell [o el testcomando, y el operador ternario foo ? bar : bazno es exclusivo de perl. (Como beneficio adicional, puedes usar diferentes modos para directorios y archivos..)

De hecho, son las opciones las que pueden necesitar explicación si eres nuevo en Perl. Un poco simplificado:

  • significa -n"ejecutar esto una vez para cada línea de STDIN, configurando $_la línea"
  • -lhace que el avance de línea al final de cada línea desaparezca (porque de lo contrario pasa a formar parte de $_)
  • -ees familiar para las personas que saben sed; dice que esta es la expresión a evaluar/ejecutar.

información relacionada