Como excluir o diretório dos resultados da pesquisa se algum de seus diretórios pai contiver um arquivo específico

1

Estou tentando usar o comando find para pesquisar recursivamente uma árvore de diretórios e retornar todos os resultados com um diretório correspondente a um determinado nome.

find . -type d -name '<NAME>'

Eu recebo uma lista de caminhos retornados que são impressos em um arquivo de log. Eu quero ser capaz de omitir quaisquer resultados que contenham um arquivo chamado omit.txt dentro de um diretório pai.

./ parent_directory / NAME >

Eu tenho tentado fazer isso com o seguinte

find . -type d -name '<NAME>' \( ! -wholename "*omit.txt*" -prune \)

Estou tentando usar o comando prune para omitir os resultados que contêm o arquivo, mas acho que isso pode funcionar apenas com diretórios. Qualquer ajuda seria muito apreciada. Eu estou tentando fazer isso em apenas um comando e manter o arquivo de saída, tanto quanto possível -

    
por Bobby Brennan 24.01.2018 / 10:45

1 resposta

2

Eu não acho que você pode fazer isso completamente dentro de find , já que você precisa ser capaz de ver o arquivo dentro do diretório ao processar o diretório. -prune precisa operar no próprio diretório, mas -path e outras condições só vêem o nome do arquivo depois que find já desceu para o diretório.

Tudo o que posso fazer é extrair um shell para espiar dentro do diretório. Algo parecido com isto:

$ mkdir -p x y/z ; touch x/foo y/omit.txt
$ find -type d \( -exec sh -c '[ -e "$1/omit.txt" ]' sh {} \; -prune -o -print \)
.
./x

foo -o bar não avalia bar se foo for bem-sucedido, portanto, se o diretório for limpo, a impressão não será executada. Adicione -o -print ao final para imprimir o conteúdo do diretório também. Não podemos usar exec ... {} + aqui, pois precisamos que isso funcione como uma condição para cada diretório separadamente.

    
por 24.01.2018 / 11:28