Diferencia dos directorys, pero ignora las extensiones

Tengo dos directorys con nombres de file similares pero diferentes extensiones. Aquí hay un ejemplo:

DIR1: - IN89284.wav - OUT9920.wav DIR2: - IN89284.mp3 - OUT9920.mp3 

Quiero comparar estos directorys, pero ignoro las extensiones de file, por lo que en ese caso serían los mismos. ¿Cómo puedo hacer eso? Supongo que tendría que recorrer el primer directory, recortar cada nombre de file (cortar la extensión) y luego searchlo en el segundo directory. ¿Hay alguna forma mejor de hacer eso?

Con zsh :

 diff -u <(cd dir1 && printf '%s\n' **/*(D:r)) \ <(cd dir2 && printf '%s\n' **/*(D:r)) 

(D) para include files de puntos (files ocultos) :r para get el rest (quitar la extensión).

Usar globbing garantiza un order de sorting consistente.

(que supone que los nombres de file no tienen caracteres de nueva línea).

Puedes usar este command:

 comm -12 <(find dir1 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) <(find dir2 -type f -exec bash -c 'basename "${0%.*}"' {} \; | sort) 

Esto usa find para enumerar todos los files en cada directory, luego basename y la sustitución de parameters para quitar los nombres de los directorys y las extensiones de los files. comm compara las dos lists.

Ejemplo:

 $ 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 los nombres de file comunes a ambos directorys. comm -23 mostrará todos los nombres de files exclusivos de dir1, comm -13 mostrará los nombres de files exclusivos de dir2.