Para poder executar um arquivo, o arquivo deve
- Seja de propriedade do usuário e seja executável pelo usuário ou
- Pertencem ao mesmo grupo do usuário e podem ser executados por esse grupo ou
- Seja executável por "outros".
O comando find
a seguir localiza esses arquivos no diretório atual (apenas para o usuário atual e seu grupo primário):
uid=$( id -u ) # the user's ID
gid=$( id -g ) # the primary group ID
find . -type f \( \
\( -user "$uid" -perm -0100 \) -o \
\( -group "$gid" -perm -0010 \) -o \
-perm -0001 \) -print
-0100
significa "pelo menos executável pelo usuário" e -0010
e -0001
são equivalentes para "grupo" e "outros".
O mesmo critério mantém ou acessibilidade de pastas (se não estou totalmente enganado), então mudar -type f
para -type d
deve dar a você as pastas acessíveis. Pode-se também querer checar as pastas para o bit "read" também, obviamente ( -0500
, -0050
e -0005
em vez de as permissões acima).
Para pastas, isso pode ser uma solução:
find . -type d \( \
\( -user "$uid" -perm -0500 \) -o \
\( -group "$gid" -perm -0050 \) -o \
-perm -0005 -o -prune \) -print
Eu adicionei -prune
no final para não descermos em pastas que o usuário não conseguiria acessar de qualquer maneira.
Altere o ponto para uma barra para pesquisar em todo o sistema.
Também é fácil alterá-lo para imprimir apenas os nomes de, por exemplo, pastas que o usuário não pode acessar:
find . -type d \( \
\( -user "$uid" -perm -0500 \) -o \
\( -group "$gid" -perm -0050 \) -o \
-perm -0005 -o -print -prune \)