Normalerweise würde ich für sowas ja an rsync denken, denn das ist im Prinzip für sowas gemacht.
Auf jeden Fall kennt es die Optionen "--dry-run" (nur Simulation, mit "--verbose") und "--from0", so dass Du mit einer Null-terminierten Liste (z.B. aus find ... -print0) vergleichen kannst.
Was ich noch nicht gefunden habe, ist wie man dem die Verwendung der nackten Dateinamen beibringt. Das müsstest Du mal selber gucken ...
Ansonsten, wenn es wirklich "zu Fuß" sein muss, wäre es wahrscheinlich sinnvoll, die Dateienliste auf der internen Festplatte in ein Array einzulesen und dann beim Abgrasen der externen Festplatte zu gucken, was Du schon hast.
Problematisch bleibt dabei allerdings, dass Dir nicht kaputte oder falsche Dateien mit dem richtigen Namen als "korrekt" durchgehen. Das prüft rsync normalerweise nämlich auch, aber wenn Du selber vergleichst, dann musst Du sinnigerweise auch dafür selber Vorkehrungen treffen.
Grundsätzlich solltest Du bei Selbstgeschriebenem immer mit Null-terminierten Strings arbeiten, damit Dir nicht mal ein Leer- oder Sonderzeichen Deinen Kram zerschießt.
LG,
track