
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 chmod
y chown
al mismo tiempo?
En la iteración actual de mi script, estoy find
procesando 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 find
tener 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 rsync
comando:
rsync <your_options> --chown www-data:www-data --chmod=F775 <source> <destination>
Puede utilizar el prefijo F
in --chmod
para archivos y D
directorios.
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.
-0
le dice a xargs que separe las entradas en el valor nulo.
-I VAR
dice usar VAR
como "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 find
procesar 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 find
y del uno perl
).
Y tampoco necesitas saber mucho de Perl para asimilarlo.
El chown y el chmod son bastante claros. -d
es el mismo que en el shell [
o el test
comando, y el operador ternario foo ? bar : baz
no 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" -l
hace que el avance de línea al final de cada línea desaparezca (porque de lo contrario pasa a formar parte de$_
)-e
es familiar para las personas que sabensed
; dice que esta es la expresión a evaluar/ejecutar.