Digamos que tenho a seguinte saída de ls -l
:
drwxr-xr-x 2 root root 4096 Apr 7 17:21 foo
Como posso converter isso automaticamente para o formato usado por chmod
?
Por exemplo:
$ echo drwxr-xr-x | chmod-format
755
Estou usando o OS X 10.8.3.
permissions
ls
chmod
Tyilo
fonte
fonte
stat
. Você tem? (É uma ferramenta GNU, por isso, na maior parte disponíveis no Linux, e não em Unix.)stat foo
dá16777219 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
. Eu não vejo755
nele.Respostas:
Alguns sistemas possuem comandos para exibir as permissões de um arquivo como um número, mas, infelizmente, nada portátil.
zsh
possui umstat
(akazstat
) embutido nostat
módulo:Em seguida, o
mode
está em$s[mode]
mas é o modo, que é do tipo + perms.Se você deseja que as permissões sejam expressas em octal, é necessário:
Os BSDs (incluindo Apple OS / X ) também têm um
stat
comando.O GNU find (desde 1990 e provavelmente antes) pode imprimir as permissões como octal:
Mais tarde (2001, muito depois
zsh
stat
(1997), mas antes do BSDstat
(2002)), umstat
comando GNU foi introduzido com outra sintaxe diferente:Muito antes disso, o IRIX já possuía um
stat
comando (já existente no IRIX 5.3 em 1994) com outra sintaxe:Novamente, quando não há comando padrão, a melhor aposta para portabilidade é usar
perl
:fonte
Você pode pedir
stat
ao GNU para emitir as permissões no formato octal usando a-c
opção Deman stat
:Então, no seu caso:
Ou você pode até automatizá-lo formatando
stat
a saída como comando válido:A solução acima também funcionará para vários arquivos se você estiver usando um curinga:
Funcionará corretamente com nomes de arquivos contendo caracteres de espaço em branco, mas falhará em nomes de arquivos que contenham aspas simples.
fonte
stat
não tem uma-c
opção. Estou usando o OS X 10.8.3.stat -f 'chmod %p "%N"'
Para converter da notação simbólica para octal, uma vez me deparei com:
Expandido:
Isso retorna o número octal da saída de
ls -l
um arquivo.fonte
dpkg
para definir permissões de volta para "como instalado". Obrigado por responder à pergunta literal sem levar em consideração qual comando produziu a sequência de permissões.Este comando no Mac sob sh
se você deseja apenas a permissão numérica, use apenas% Lp.
por exemplo:
O 700 é a permissão numérica que pode ser usada no chmod e Desktop é o nome do arquivo.
fonte
Aqui está uma resposta para a pergunta Y (ignorando a pergunta X ), inspirada na tentativa do OP:
O texto acima contém alguns basismos. A seguinte versão parece ser compatível com POSIX:
Notas:
LC_COLLATE=C
comando diz ao shell para tratar os padrões de intervalo de sequência de letras como usando a ordem ASCII, portanto[a-e]
é equivalente a[abcde]
. Em alguns locais (por exemplo, en_US),[a-e]
é equivalente a[aAbBcCdDeE]
(ou seja,[abcdeABCDE]
) ou talvez[abcdeABCD]
- consulte Por que a instrução bash case não diferencia maiúsculas de minúsculas…? )Na segunda versão (a compatível com POSIX):
A primeira
case
declaração pode ser reescrita:mas acho que do jeito que tenho agora facilita ver que
l
é a letra que está sendo tratada de maneira diferente. Como alternativa, ele pode ser reescrito:desde
r
,w
,x
,s
, et
são as únicas cartas que nunca deve aparecer em uma string de modo (diferentel
).A segunda
case
declaração pode ser reescrita:para impor a regra de que apenas letras são válidas para especificar bits de modo. (Por outro lado, a versão mais sucinta do script completo é preguiçosa e aceita
-rw@rw#rw%
como equivalente arwSrwSrwT
.) Como alternativa, ela pode ser reescrita:desde
S
,s
,T
,t
,L
, el
são as únicas cartas que nunca deve aparecer em uma string modo (excetor
,w
, ex
).Uso:
E, sim, eu sei que é melhor não usar
echo
com texto que possa começar-
; Eu só queria copiar o exemplo de uso da pergunta. Observe, obviamente, que isso ignora o 0º caractere (ou seja, od
/b
/c
/-
/l
/p
/s
/D
) inicial e o 10º (+
/.
/@
). Ele pressupõe que os mantenedores dels
nunca definirãor
/R
ouw
/W
como caracteres válidos na terceira, sexta ou nona posição (e, se o fizerem, devem ser espancados com paus ).Além disso, encontrei o código a seguir, por cas , em Como restaurar a propriedade padrão do grupo / usuário de todos os arquivos em / var :
Eu testei esse código (mas não completamente) e parece funcionar, exceto pelo fato de que ele não reconhece
l
ou estáL
na sexta posição. Observe, porém, que, embora essa resposta seja superior em termos de simplicidade e clareza, a minha é realmente mais curta (contando apenas o código dentro do loop; o código que lida com uma única-rwxrwxrwx
sequência, sem contar comentários), e pode ser ainda mais curta substituindo por .if condition; then …
condition && …
Obviamente, você não deve analisar a saída de
ls
.fonte
#!/bin/sh
e depois usei alguns basismos. Opa Mas você perdeu alguns:$((
variable++
))
e não parecem ser POSIX quer (o padrão não menciona em tudo, e é squirrelly em e ). Por outro lado, eu não usei ; que aparece apenas em cas resposta ‘s, que citou a partir de aqui . Além disso, minha resposta lida com 'l' e 'L', e eu já apontei o fato de que a resposta de cas não.$((
number
**
number
))
**
++
--
[[…]]
$((- -a))
se quiser uma dupla negação, não que você possa usar$((--a))
para significar uma operação de decremento.seq
não é um comando POSIX. Você pode usar o operador $ {var #?} Para evitar expr. Não que LC_COLLATE não substitua LC_ALL8
ou9
não, e não há maneira de obter mais do que7
em qualquer posição decimal, ele pode retirar a farsa. ... ... ... ... ... ... ... ... (Este comentário é uma resposta a um comentário Stéphane Chazelas que desapareceu.)Se seu objetivo é obter permissões de um arquivo e também concedê-las a outro, o GNU
chmod
já possui uma opção de "referência" para isso .fonte
chmod
não será o GNUchmod
lá.Uma alternativa, se você quiser salvar as permissões, restaurá-las posteriormente ou em um arquivo diferente, é usar
setfacl/getfacl
e também restaurará ACLs (rascunho do POSIX) como um bônus.(no Solaris, use em
-f
vez de-M
).No entanto, embora estejam disponíveis em alguns BSDs, eles não estão no Apple OS / X onde as ACLs são manipuladas
chmod
apenas.fonte
No Mac OS X (10.6.8) você precisa usar
stat -f format
(porque na verdade é o NetBSD / FreeBSDstat
).Para traduzir apenas uma sequência de permissão simbólica produzida por
ls -l
em octal (usando apenas shellins internos), consulte: showperm.bash .fonte