Digamos que tengo el siguiente resultado de ls -l:
drwxr-xr-x 2 root root 4096 Apr 7 17:21 foo
¿Cómo puedo convertir esto automáticamente al formato utilizado por chmod?
Por ejemplo:
$ echo drwxr-xr-x | chmod-format
755
Estoy usando OS X 10.8.3.
permissions
ls
chmod
Tyilo
fuente
fuente

stat. ¿Lo tienes? (Es una herramienta GNU, por lo que en su mayoría disponibles en Linux, no en Unix.)stat fooda16777219 377266 drwxr-xr-x 119 Tyilo staff 0 4046 "Apr 7 17:49:03 2013" "Apr 7 18:08:31 2013" "Apr 7 18:08:31 2013" "Nov 25 17:13:52 2012" 4096 0 0 /Users/Tyilo. No lo veo755en eso.Respuestas:
Algunos sistemas tienen comandos para mostrar los permisos de un archivo como un número, pero desafortunadamente, nada portátil.
zshtiene unstat(akazstat) incorporado en elstatmódulo:Entonces, el
modeestá en$s[mode]pero es el modo, es decir, tipo + permisos.Si desea los permisos expresados en octal, necesita:
Los BSD (incluido Apple OS / X ) también tienen un
statcomando.GNU find (desde 1990 y probablemente antes) puede imprimir los permisos como octal:
Más tarde (2001, mucho después
zshstat(1997) pero antes de BSDstat(2002))statse introdujo un comando GNU con una sintaxis diferente:Mucho antes de eso, IRIX ya tenía un
statcomando (ya en IRIX 5.3 en 1994) con otra sintaxis:Nuevamente, cuando no hay un comando estándar, la mejor opción para la portabilidad es usar
perl:fuente
Puede pedirle a GNU
statque muestre los permisos en formato octal utilizando la-copción Deman stat:Entonces en tu caso:
O incluso puede automatizarlo formateando
statla salida como comando válido:La solución anterior también funcionará para varios archivos si usa un comodín:
Funcionará correctamente con los nombres de archivo que contienen caracteres de espacio en blanco, pero fallará en los nombres de archivo que contengan comillas simples.
fuente
statno tiene una-copción. Estoy usando OS X 10.8.3.stat -f 'chmod %p "%N"'Para convertir de la notación simbólica a octal, una vez se me ocurrió :
Expandido:
Eso devuelve el número octal de la salida de
ls -lun archivo.fuente
dpkgpara establecer los permisos de nuevo a "como instalado". Gracias por responder la pregunta literal sin tener en cuenta qué comando produjo la cadena de permiso.Este comando en Mac bajo sh
si solo desea el permiso numérico, use solo% Lp.
por ejemplo:
El 700 es el permiso numérico que se puede usar en chmod, y Desktop es el nombre del archivo.
fuente
Aquí hay una respuesta a la pregunta Y (ignorando la pregunta X ), inspirada en el intento del OP:
Lo anterior contiene algunos bashismos. La siguiente versión parece ser compatible con POSIX:
Notas:
LC_COLLATE=Cle dice al shell que trate los patrones de rango de secuencia de letras como si usaran el orden ASCII, por lo que[a-e]es equivalente a[abcde]. En algunos entornos locales (p. Ej., En_US),[a-e]es equivalente a[aAbBcCdDeE](es decir,[abcdeABCDE]) o tal vez[abcdeABCD], vea ¿Por qué la declaración de caso bash no distingue entre mayúsculas y minúsculas ...? )En la segunda versión (la que cumple con POSIX):
La primera
casedeclaración podría reescribirse:pero creo que lo que tengo ahora hace que sea más fácil ver que
lla carta se maneja de manera diferente. Alternativamente, podría reescribirse:ya que
r,w,x,s, ytson las únicas cartas que nunca deben aparecer en una cadena de modo (que no seal).La segunda
casedeclaración podría reescribirse:para hacer cumplir la regla de que solo las letras son válidas para especificar bits de modo. (Por el contrario, la versión más sucinta en el script completo es perezosa y aceptará
-rw@rw#rw%como equivalente arwSrwSrwT). Alternativamente, podría reescribirse:ya que
S,s,T,t,L, ylson las únicas cartas que nunca deben aparecer en una cadena modo (exceptor,wyx).Uso:
Y sí, sé que es mejor no usar
echocon texto que pueda comenzar-; Solo quería copiar el ejemplo de uso de la pregunta. Tenga en cuenta, obviamente, que esto ignora el carácter 0 (es decir, eld/b/c/-/l/p/s/D) y el 10 (+/./@). Se supone que los mantenedores delsnunca definiránr/Row/Wcomo caracteres válidos en la tercera, sexta o novena posición (y, si lo hacen, deberían ser golpeados con palos ).Además, acabo de encontrar el siguiente código, por cas , en Cómo restaurar la propiedad predeterminada del grupo / usuario de todos los archivos en / var :
He probado este código (pero no a fondo), y parece funcionar, excepto por el hecho de que no reconoce
loLen la sexta posición. Sin embargo, tenga en cuenta que, si bien esta respuesta es superior en términos de simplicidad y claridad, la mía es en realidad más corta (contando solo el código dentro del bucle; el código que maneja una sola-rwxrwxrwxcadena, sin contar comentarios), y podría hacerse aún más corto reemplazando con .if condition; then …condition && …Por supuesto, no debe analizar la salida de
ls.fuente
#!/bin/shy luego usé algunos bashismos. Ups Pero te perdiste un par: y tampoco pareces ser POSIX (el Estándar no menciona nada, y está ardiendo y ). Por el contrario, yo no uso ; eso aparece solo en la respuesta de cas , que cité desde aquí . Además, mi respuesta maneja 'l' y 'L', y ya señalé el hecho de que la respuesta de cas no.$((variable++))$((number**number))**++--[[…]]$((- -a))si desea una doble negación, no que pueda usar$((--a))para referirse a una operación de disminución.seqno es un comando POSIX. Es posible que pueda usar el operador $ {var #?} Para evitar expr. No es que LC_COLLATE no anule LC_ALL8's' o9's, y no hay forma de obtener más que7en cualquier posición decimal, puede tirar de la farsa. ... ... ... ... ... ... ... (Este comentario es una respuesta a un comentario de Stéphane Chazelas que desapareció)Si su objetivo es tomar permisos de un archivo y darlos también a otro, GNU
chmodya tiene una opción de "referencia" para eso .fuente
chmodlo que no será el GNUchmodallí.Una alternativa, si desea guardar los permisos, para restaurarlos más adelante, o en un archivo diferente es usar
setfacl/getfacl, y también restaurará las ACL (borrador POSIX) como un bono.(en Solaris, use en
-flugar de-M).Sin embargo, aunque están disponibles en algunos BSD, no están en Apple OS / X donde
chmodsolo se manipulan las ACL .fuente
En Mac OS X (10.6.8) tiene que usar
stat -f format(porque en realidad es NetBSD / FreeBSDstat).Para traducir simplemente una cadena de permisos simbólicos producida por
ls -len octal (usando solo shell incorporado) ver: showperm.bash .fuente