#!/bin/bash -eu
#
# Replace duplicate files with symbolic links
#

if [ $# -ne 1 ] ; then
	echo "Usage: symlink-duplicates <dirname>" >&2
	exit 2
fi

if ! [ -d "${1}" ] ; then
	echo "No such directory: ${1}" >&2
	exit 1
fi

echo "Symlink duplicate files in ${1} ..."

prev_md5=
while IFS= read -r line ; do
	md5=${line::32}
	fw=${line:34}
	if [ "${md5}" != "${prev_md5}" ] ; then
		tgt=${fw}
	else
		lnk=$(realpath --relative-to="${fw%/*}" "${tgt}")
		echo "  ${fw} -> ${lnk}"
		rm -f "${fw}"
		ln -s "${lnk}" "${fw}"
	fi
	prev_md5=${md5}
done < <(find "${1}" ! -empty -type f -exec md5sum -b {} + | \
         sort | uniq -w32 -dD)
