{ 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 -uremove duplicados; - há
find ... | sort -upipe para cada uma das duas extensões; - o% final
sort | uniq -dimprime linhas que aparecem mais de uma vez; um caminho de diretório aparecerá mais de uma vez, se for retornado por cadafind ... | sort -u.
Há pelo menos dois problemas:
-
-printfnã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 -dxargsirá reclamar sefindnão encontrar nada; isso não deve quebrar a lógica. -
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
" | sort -u; find . -type f -name "*.ext2" -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 -z -u; } | sort -z | uniq -z -d{ find . -type f -name "*.ext1" | xargs -L 1 dirname | sort -u; find . -type f -name "*.ext2" | xargs -L 1 dirname | sort -u; } | sort | uniq -dPara 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.