Você poderia usar este comando:
comm -12 <(find dir1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find dir2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort)
Isso usa find
para listar todos os arquivos em cada diretório e, em seguida, basename
e substituição de parâmetro para remover os nomes de diretório e as extensões de arquivo. comm
compara as duas listas.
Exemplo:
$ tree
.
|-- dir1
| |-- test1.txt
| |-- test2.txt
| '-- test3.txt
'-- dir2
|-- test2.txt
'-- test4.txt
$ comm -12 <(find dir1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find dir2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort)
test2
$ comm -23 <(find dir1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find dir2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort)
test1
test3
$ comm -13 <(find dir1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find dir2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort)
test4
comm -12
mostrará todos os nomes de arquivos comuns aos dois diretórios. comm -23
mostrará todos os nomes de arquivos exclusivos para dir1, comm -13
mostrará os nomes de arquivos exclusivos para dir2.