Encontre diretórios / arquivos w com 2 extensões diferentes

0

Então, estou tentando pensar em como posso fazer isso. Eu posso encontrar os arquivos com isso, por exemplo, mas realmente o que eu quero é os diretórios especificamente que contêm os dois tipos de arquivo. Alguma idéia?

Além disso, eu não me importo com o nome do arquivo, apenas que o diretório contém um arquivo / w ambas as extensões.

find . -type f \( -name "*.ext1" -or -name "*.ext2" \)
    
por Dulanic 08.10.2018 / 04:42

1 resposta

0
{ find . -type f -name "*.ext1" -printf "%h\n" | sort -u; find . -type f -name "*.ext2" -printf "%h\n" | sort -u; } | sort | uniq -d

Explicação:

  • find ... -printf "%h\n" imprime diretórios contendo arquivos correspondentes;
  • sort -u remove duplicados;
  • find ... | sort -u pipe para cada uma das duas extensões;
  • o% final sort | uniq -d imprime linhas que aparecem mais de uma vez; um caminho de diretório aparecerá mais de uma vez, se for retornado por cada find ... | sort -u .

Há pelo menos dois problemas:

  1. -printf não é POSIX. Uma variante portátil do comando pode ser:

    { find . -type f -name "*.ext1" | xargs -L 1 dirname | sort -u; find . -type f -name "*.ext2" | xargs -L 1 dirname | sort -u; } | sort | uniq -d
    

    xargs irá reclamar se find não encontrar nada; isso não deve quebrar a lógica.

  2. Novas linhas nos nomes dos diretórios quebrarão a lógica. Eles podem gerar falsos positivos, tornar a saída ambígua. Ferramentas estendidas além do seu mínimo POSIX podem suportar opções que permitem que você analise strings terminadas em null. Isso funciona no meu Debian:

    { find . -type f -name "*.ext1" -printf "%h
    { find . -type f -name "*.ext1" -printf "%h\n" | sort -u; find . -type f -name "*.ext2" -printf "%h\n" | sort -u; } | sort | uniq -d
    
    " | sort -u; find . -type f -name "*.ext2" -printf "%h
    { find . -type f -name "*.ext1" | xargs -L 1 dirname | sort -u; find . -type f -name "*.ext2" | xargs -L 1 dirname | sort -u; } | sort | uniq -d
    
    " | sort -z -u; } | sort -z | uniq -z -d

    Para obter um formato mais legível, canalize-o para tr '%code%' '\n' . Novas linhas de nomes de diretórios ainda causarão ambigüidade, mas pelo menos várias linhas de um único nome de diretório aparecerão consecutivamente, como você certamente as deseja.

por 08.10.2018 / 06:59