Como posso excluir todas as mensagens de "permissão negada" de "localizar" no Solaris

3

Oi perguntas anteriores sobre este tópico contêm respostas para o Linux, mas não funciona para o Solaris 10.

find . ! -readable -prune

Não funciona no solaris, pois a leitura não é POSIX.

Qual é o comando compatível com POSIX que exclui todas as mensagens de “permissão negada” de “localizar” no Solaris?

Respostas corretas: jlliagre e random832 deram respostas corretas.

    
por he wei 09.08.2015 / 22:14

3 respostas

6

Aqui está uma maneira POSIX de remover qualquer diretório não legível com find :

find . \( -exec sh -c ' if [ ! -r "$1" ] ; then { exit 1 ; } ; else for i in "$1"/* ; do if [ -d "$i" -a ! -r "$i" ]; then exit 1; fi; done; fi ' sh {} \; -o -prune \) -a -print

Note que se esta for uma instalação completa do Solaris, o GNU grep está disponível em /usr/sfw/bin/ggrep .

    
por 09.08.2015 / 23:49
2

Basta filtrá-los.

find . 2>&1 | grep -v "^find: cannot read dir .*: Permission denied$"
    
por 09.08.2015 / 23:22
0

Se você preferir não chamar um subshell para cada arquivo, este refinamento da resposta do jlliagre faz tudo com find predicados, desde que não haja ACLs para torná-lo ainda mais complicado. O manuseio correto de diretórios legíveis mas não pesquisáveis é deixado como um exercício. Se você ainda não viu o #! thingy, significa "não tente copiar tudo isso na linha de comando; em vez disso, coloque-o em um arquivo, textualmente, chmod +x it e invoque-o como ./nameoffile <directory> . "

#! /usr/xpg4/bin/sh

PATH=/usr/local/bin:/usr/xpg4/bin:/usr/bin:/bin
export PATH

me="-user $(id -u)"
my_groups="( -group $(id -G | sed 's/ / -o -group /g') )"

prune_me="( ( $me ! -perm -0400 ) -prune )"
prune_group="( ( ! $me $my_groups ! -perm -0040 ) -prune )"
prune_other="( ( ! $me ! $my_groups ! -perm -0004 ) -prune )"

find "$@" $prune_me -o $prune_group -o $prune_other -o -print
    
por 10.08.2015 / 01:03