Comportamento esperado de 'find -depth' se permissão de execução negada para o subdiretório?

7

Gostaria de saber se posso confiar no comportamento que estou vendo ao usar a opção find with -depth e o usuário não tem permissão de execução para um subdiretório.

Assuma a seguinte estrutura de diretório:

drwxrwxrwt. 10 root    root     12288 Mar 14 04:31 .
dr-xr-xr-x. 24 root    root      4096 Dec  6 03:33 ..
drwx------   4 root    root      4096 Mar 14 04:03 jen

Execute o seguinte comando como usuário não root:

find -type d

A saída é:

.
./jen
find: './jen': Permission denied

Então find encontrou o diretório jen e produziu isso. Em seguida, ele tentou descer em jen , mas não tinha permissão para imprimir o erro. A primeira linha acima é impressa em stdout e a segunda linha em stderr .

Agora, execute o seguinte como usuário não raiz:

find -depth -type d

E a saída é:

find: './jen': Permission denied
.

Portanto, o nome do caminho não é enviado para stdout , a menos que o usuário tenha permissão para listar o conteúdo do diretório.

Esta saída é perfeita para o que eu quero fazer. No entanto, não tenho certeza se isso é apenas uma coincidência ou não. Posso confiar neste comportamento?

Estou usando o GNU findutils 4.4.2. Eu estou querendo saber se esse comportamento é o mesmo em todas as versões do find . E se não, é pelo menos o mesmo em todas as versões do GNU find.

Não importa para mim (para este caso de uso) se jen é impresso no primeiro exemplo. Só estou querendo saber se posso depender de ser excluído quando -depth for usado. Normalmente, não é uma boa ideia confiar em comportamento não documentado. Mas, para mim, esse efeito colateral faz sentido. Então, estou pensando que isso pode ser o comportamento pretendido .

O manual diz:

— Option: -depth

Process each directory's contents before the directory itself.

Isto é exatamente o que eu quero, mas não está claro se o nome do caminho do diretório em si será excluído da saída se não descer nele.

Graças a uma sugestão do Hauke Laging, descobri que posso listar diretórios somente e excluir diretórios explicitamente onde a permissão para listar seu conteúdo é negada:

find -type d \( \( -type d \( \! -executable -or \! -readable \) \) -prune -or -print \)

Isso também tem o efeito de interromper os erros "Permissão negada" porque find nunca tenta entrar em um diretório se não tiver permissão.

Infelizmente, existem duas razões pelas quais isso não funcionará para as minhas necessidades.

  • Eu quero as mensagens de erro
  • preciso da opção -depth

Citando o manual

If the ‘-depth’ option is in effect, the subdirectories will have already been visited in any case. Hence ‘-prune’ has no effect in this case.

Então eu voltei para onde comecei.

Ainda não está claro se "processa ou não o conteúdo de cada diretório antes do próprio diretório." também significa "Não processe o diretório se você não puder processar seu conteúdo".

    
por toxalot 14.03.2014 / 12:48

1 resposta

2

Provavelmente, a melhor abordagem é lidar explicitamente com esses diretórios. Não sei se esses são recursos padrão, mas pelo menos com o Gnu find isso é possível:

find . \( -type d \( \! -executable -or \! -readable \) \) -prune -or -type d

é claro, também é possível imprimir uma mensagem se um diretório for ignorado:

find . \( -type d \( \! -executable -or \! -readable \) \) \
  -printf "Permission denied: %p\n" -prune -or -type d -print
    
por 14.03.2014 / 14:16