Localizando arquivos e diretórios com umask diferente

1

Eu tenho uma umask como 0002 usando umask -S e retorna u=rwx,g=rwx,o=rx .

Como faço para encontrar todos os arquivos e diretórios que não possuem direitos configurados de acordo com a máscara?

Os diretórios ficam em 777 - mask e arquivos 666 - mask Se eu fizer algo como

find . ! -perm $(umask -S) 

encontrará todos os arquivos / diretórios que não possuem direitos definidos como u=rwx,g=rwx,o=rx (777 - 002 há direitos, mas 666 - 002 são direitos diferentes), o que é bom para diretórios, mas não para arquivos.

Como faço para encontrar arquivos com direitos diferentes dos atuais definidos como umask?

exemplo

 touch one
 ls -l
 -rw-rw-r-- 1 trolkura trolkura 0 kvě  4 09:01 one

umask é 0002, então isso resulta em 664 , mas quando eu faço

find . -type f ! -perm $(umask -S)
./one

O resultado mostra o arquivo recém-criado porque ele está procurando arquivos que não possuem 775 direitos (direitos de diretório).

    
por trolkura 04.05.2016 / 08:45

2 respostas

1

Por que você não experimenta este:

find . -user trolkura ! -perm -u+rw

Isso significa: procurar por arquivos que começam no diretório atual, de propriedade de trolkura, onde as permissões para group e other podem ser qualquer coisa (- na frente da string de permissão) e as permissões dos usuários são apenas: rw

    
por 04.05.2016 / 09:28
0

Você pode usar os formulários octal e fazer os cálculos manualmente. Com um shell POSIX:

dir_perms=$(printf '%#o' "$((0777 - $(umask)))")
non_dir_perms=$(printf '%#o' "$((dir_perms & 0666))")
find . -type d ! -perms "$dir_perms" -o ! -type d ! -perms "$non_dir_perms"

O formato de saída de umask sozinho não é especificado por POSIX, mas, na prática, será todos os shells, é um número octal com pelo menos um 0 à esquerda.

zsh não trata números com 0s iniciais como octal por padrão. Em zsh , você pode ativar sh emulação em um contexto local para isso ( (){ emulate -L sh; ....} ou (emulate sh; ...) ou apenas set -o octalzeroes ) ou usar:

dir_perms=0$(([##8] 8#777 - 8#$(umask)))
non_dir_perms=0$(([##8] 8#$dir_perms & 8#666))

Com mksh que não trata números com 0s iniciais como octal por padrão, você pode usar set -o posix ou fazer:

dir_perms=$(printf '%#o' "$((8#777 - 8#$(umask)))")
non_dir_perms=$(printf '%#o' "$((8#$dir_perms & 8#666))")
    
por 04.05.2016 / 10:16

Tags