{ 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; - há
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 cadafind ... | sort -u
.
Há pelo menos dois problemas:
-
-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 sefind
nã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 -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.