Se nenhum dos nomes de arquivo contiver novas linhas, você pode fazer:
find D -type f \( -name '*.A' -o -name '*.B' \) |
sed 's/\.[^.]*$//' |
sort |
uniq -d >paired_files
Isso deve funcionar no caso mais geral, em que há .B
arquivos sem .A
arquivos.
Para lidar com qualquer nome de arquivo usando ferramentas GNU recentes:
find D -type f \( -name '*.A' -o -name '*.B' \) -print0 |
sed -z 's/\.[^.]*$//' |
sort -z |
uniq -dz |
tr 'find D -type f \( -name '*.A' -o -name '*.B' \) |
sed 's/\.[^.]*$//' |
sort |
uniq -d >paired_files
' '\n' >paired_files