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 foo
da16777219 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 veo755
en eso.Respuestas:
Algunos sistemas tienen comandos para mostrar los permisos de un archivo como un número, pero desafortunadamente, nada portátil.
zsh
tiene unstat
(akazstat
) incorporado en elstat
módulo:Entonces, el
mode
está 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
stat
comando.GNU find (desde 1990 y probablemente antes) puede imprimir los permisos como octal:
Más tarde (2001, mucho después
zsh
stat
(1997) pero antes de BSDstat
(2002))stat
se introdujo un comando GNU con una sintaxis diferente:Mucho antes de eso, IRIX ya tenía un
stat
comando (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
stat
que muestre los permisos en formato octal utilizando la-c
opción Deman stat
:Entonces en tu caso:
O incluso puede automatizarlo formateando
stat
la 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
stat
no tiene una-c
opció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 -l
un archivo.fuente
dpkg
para 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=C
le 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
case
declaración podría reescribirse:pero creo que lo que tengo ahora hace que sea más fácil ver que
l
la carta se maneja de manera diferente. Alternativamente, podría reescribirse:ya que
r
,w
,x
,s
, yt
son las únicas cartas que nunca deben aparecer en una cadena de modo (que no seal
).La segunda
case
declaració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
, yl
son las únicas cartas que nunca deben aparecer en una cadena modo (exceptor
,w
yx
).Uso:
Y sí, sé que es mejor no usar
echo
con 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 dels
nunca definiránr
/R
ow
/W
como 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
l
oL
en 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-rwxrwxrwx
cadena, 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/sh
y 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.seq
no 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 que7
en 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
chmod
ya tiene una opción de "referencia" para eso .fuente
chmod
lo que no será el GNUchmod
allí.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
-f
lugar de-M
).Sin embargo, aunque están disponibles en algunos BSD, no están en Apple OS / X donde
chmod
solo 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 -l
en octal (usando solo shell incorporado) ver: showperm.bash .fuente