Encontre arquivos baseados em irmãos

0

Considere este diretório:

thingsToThinkAbout/
    thing1.txt
    thing2.txt
    thing2.txt.thoughts.txt
    thing3.txt
    thing7.txt.thoughts.txt

Com bash find , posso procurar as coisas ( find . -name "thing*.txt" ), os pensamentos ( find . -name "thing*.txt.thoughts.txt" ) ou ambos ( find . -name "*.txt" ), mas posso usar o comando para pesquisar com base em irmãos também?

No meu exemplo, não pensei em thing1.txt e thing3.txt , e tenho algumas reflexões sobre uma "coisa 7", que não existe. Para encontrá-los, eu teria que procurar por arquivos X que não têm irmãos chamados Y. Como isso pode ser feito?

Obviamente, eu poderia escrever um script completo com if s, mas isso é necessário?

    
por Bowi 10.07.2018 / 16:59

1 resposta

1

Nota

With bash find I can look for the things (find . -name "thing*.txt")

Você já tentou isso? Isso também encontrará pensamentos. A seguinte chamada de find os exclui:

find . -name "thing*.txt" ! -name "*.thoughts.txt"

Resposta

Para encontrar coisas sem pensar, você pode usar -exec (ou -execdir ) como teste. Ele será bem-sucedido se o comando chamado retornar o status de saída de 0 . Nesse caso, o comando é test :

find . -name "thing*.txt" ! -name "*.thoughts.txt" -exec test ! -e "{}.thoughts.txt" \; -print

Como você pode ver, é muito fácil adicionar uma string ao nome ( "{}.thoughts.txt" ). Para encontrar pensamentos sem coisas, você basicamente faz o mesmo, mas precisa remover alguma corda; não é tão fácil. Um shell extra pode fazer isso:

find . -name "thing*.txt.thoughts.txt" -exec sh -c 'test ! -e "${1%.thoughts.txt}"' sh {} \; -print

${1%.thoughts.txt} retorna $1 com .thoughts.txt removido do final. Verificamos se esse arquivo não existe.

Observação find … -exec test … executa o executável test , enquanto sh -c 'test …' usa test incorporado em sh . Estes não são os mesmos, não importa neste caso.

    
por 10.07.2018 / 18:03