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))")