Usando find no Solaris 10 para procurar um único diretório, mas não seus subdiretórios

3

Estou tentando usar find no Solaris 10 para listar o conteúdo de um diretório, excluindo os subdiretórios da pesquisa. Experimentei um comando com base na solução sugerida sdaau :

find /tmp -type d ! -perm -u+rx -prune -o -type f -name dsm\*

Infelizmente, além de retornar os resultados desejados, isso ainda resulta em erros como estes:

find: cannot read dir /tmp/hsperfdata_oracle4: Permission denied
find: cannot read dir /tmp/hsperfdata_jsweb: Permission denied

Existem alguns diretórios em / tmp para os quais o usuário que está executando find não leu nem executou (autorização).

-bash-3.2$ ls -ld /tmp/hsp*
drwxr-x---   2 jsweb    other        117 Jan  5 13:00 /tmp/hsperfdata_jsweb
drwxr-x---   2 oracle4  dba4         117 Nov  5 19:51 /tmp/hsperfdata_oracle4
drwxr-xr-x   2 root     root         117 Jan 22 08:58 /tmp/hsperfdata_root

Eu preciso encontrar uma maneira de eliminar esses erros para que find não termine com um código de retorno diferente de zero. O que eu estou negligenciando?

    
por mlowry 22.01.2016 / 14:13

4 respostas

1

Você pode simplesmente descartar esses erros e ignorar o status de saída:

find /tmp -name dsm\* -type f 2> /dev/null || :

Se você ainda quiser manter o stderr de find , para ainda poder ver outros erros além da falha em inserir ou listar diretórios devido à restrição de permissão de acesso, tente usar uma sintaxe que detecte esses problemas de permissão, mas isso vai ser complicado.

Os diretórios aos quais você não tem acesso dependem da permissão e propriedade (usuário e grupo). Você precisaria de algo como:

export "PATH=$(getconf PATH):$PATH"
u=$(id -u) g=$(id -G | sed 's/ / -o -group /g'); IFS=" "
find /tmp -type d ! \( \
    -user "$u" -perm -u=rx -o \
    ! -user "$u" \( -group $g \) -perm -g=rx -o \
    ! -user "$u" ! \( -group $g \) -perm -o=rx \
  \) -prune -o -type f -name dsm\* -print

Dito isto, nos meus testes, no Solaris 11, find ainda vai reclamar sobre diretórios que ele não pode ler mesmo que você os tenha apagado, e no Solaris 10, eu não consigo nem fazer isso qualquer ação, quanto mais -prune neles.

Portanto, o Solaris find parece estar além da esperança nessa frente. Você pode usar o perl ' File::Find module.

Observe também que a abordagem acima leva em consideração apenas as permissões simples do Unix, não as ACLs ou outras restrições de segurança.

    
por 22.01.2016 / 15:40
0

Nos seus exemplos, ! -perm -u+rx não é avaliado como verdadeiro - os proprietários ainda têm esses direitos. Você deveria usar ! -perm -o+rx . Então:

find /tmp -type d ! -perm -o+rx -prune -o -type f -name dsm\*
    
por 22.01.2016 / 15:16
0

Não tem certeza do que você está tentando realizar, mas como você não deseja subdiretórios, por que não apenas executar um ls e canalizá-lo para grep ? Com talvez um awk ou sort para atender às suas necessidades?

    
por 04.01.2017 / 17:35
-3
find /tmp -type d ! -perm -775 -prune -o -type f -name dsm\*
    
por 22.01.2016 / 16:15

Tags