localiza arquivos onde as permissões de grupo são iguais às permissões do usuário

1

É possível fazer algo como find -perm g=u ? Eu digo "como" porque -perm mode requer modo para especificar todos os bits, não apenas g , e porque eu não posso colocar u no lado direito do = , como eu posso com o chmod comando:

you can specify exactly one of the letters ugo: the permissions granted
to  the  user  who  owns the file (u), the permissions granted to other
users who are members of the file's  group  (g),  and  the  permissions
granted  to  users  that are in neither of the two preceding categories
(o).

No momento, estou fazendo find | xargs -d \n ls -lartd | egrep '^.(...) , o que é muito feio.

Obrigado.

    
por Jayen 18.06.2012 / 01:33

2 respostas

2

Isso é muito melhor (produz saída delimitada por nova linha):

find . -type f -printf '%04m%p\n' | perl -ne 'print substr($_, 4) if /^.(.)/'

Ou se algum dos seus nomes de arquivos puder conter caracteres de nova linha (produz uma saída delimitada por bytes nulos):

find . -type f -printf '%04m%p
0644./.config/banshee-1/banshee.db
0664./.config/gedit/gedit-print-settings
0664./.config/gedit/gedit-page-setup
0644./.config/gedit/accels
' | perl -n0e 'print substr($_, 4) if /^.(.)/'

Essencialmente, o comando find produz uma saída assim:

./.config/gedit/gedit-print-settings
./.config/gedit/gedit-page-setup

O comando perl, em seguida, filtra essa saída e retira o modo do arquivo antes de imprimir qualquer linha correspondente:

find . -type f -printf '%04m%p\n' | perl -ne 'print substr($_, 4) if /^.(.)/'

Se você deseja incluir diretórios, FIFOs, soquetes e nós de dispositivos, em vez de apenas arquivos, omita o -type f . Então, todos os links simbólicos aparecerão na lista (como sempre têm o modo 0777), então você pode querer excluí-los com ! -type l ou segui-los com -L .

    
por 18.06.2012 / 03:10
1

Tente isto: (teve que editar, negligenciado para manipular nomes de arquivos com espaços)

find . -type d -or -type f -ls | \
 awk '{ perm=$3; fname=11; if (substr(perm,1,3) == substr(perm,4,3)) { printf "%s",perm; while (fname<=NF) printf " %s",$(fname++); printf "\n"; } }'

Linha dividida no tubo para facilitar a leitura, mas funcionalmente apenas uma linha

Usando find para mostrar apenas arquivos e diretórios, o que exclui links simbólicos (sempre tem lrwxrwxrwx perms), sockets e outros non-wants.

O script awk analisa a saída do find 'ls', compara as substrings correspondentes às permissões de usuário e grupo, se igual, imprime as permissões e o nome do arquivo.

É claro que você pode remover a parte 'perm' da declaração impressa para ter apenas os nomes dos arquivos, depois de testá-la para sua satisfação.

    
por 18.06.2012 / 02:36