Como você encontra o caminho de um diretório que contém um arquivo, mas não contém outro arquivo?

0

Neste momento, minha abordagem é:

  • encontre diretórios contendo a.txt

    find -type f -iname "a.txt" | sed -r 's|/[^/]+$||' > a_paths.txt 
    
  • encontre diretórios contendo b.txt

    find -type f -iname b.txt |  sed -r 's|/[^/]+$||' > b_paths.txt
    
  • imprima a diferença

    comm -23 <(sort a_paths.txt ) <(sort b_paths.txt)
    

Existe alguma maneira eficiente com um find one-liner?

    
por LukasT 17.09.2018 / 15:38

2 respostas

5

Se o seu find suportar -execdir e -printf :

find . -name a.txt -execdir [ ! -e b.txt ] \; -printf %h\n

procurará arquivos com o nome a.txt , verifique se eles têm um arquivo de b.txt de irmão e, se eles não exibirem o nome do diretório de conteúdo.

Sem -execdir ou -printf :

find . -name a.txt -exec sh -c '
  for file do
    dir=${file%/*}
    [ -e "$dir/b.txt" ] || printf "%s\n" "$dir"
  done' sh {} +

Também é mais eficiente porque não executa um comando por arquivo.

    
por 17.09.2018 / 15:44
1

com zsh :

printf '%s\n' **/*(D/e'{[[ -e $REPLY/a.txt && ! -e $REPLY/b.txt ]]}')

Ou:

printf '%s\n' **/a.txt(D^e'{[[ -e $REPLY:h/b.txt ]]}':h)
    
por 17.09.2018 / 17:28

Tags