sh-4.4$ sh-4.4$ mkdir /tmp/test_ln -p; cd /tmp/test_ln sh-4.4$ mkdir src dst sh-4.4$ mkdir src/dir{1,2,3,4,5} sh-4.4$ for i in {1..5}; do touch src/dir$i/$i; done sh-4.4$ touch src/dir3/{1,2} sh-4.4$ sh-4.4$ function merge() { local src_d=${1} dst_d="${2}"; for i in "${src_d}"/*/*; do local dst=${dst_d}/$(basename ${i}); if test -d "${i}"; then mkdir "${dst}"; merge "${i}" "${dst}"; else ln -T "${i}" "${dst}"; fi; done; } sh-4.4$ merge src dst ln: не удалось создать жёсткую ссылку 'dst/1': Файл существует ln: не удалось создать жёсткую ссылку 'dst/2': Файл существует sh-4.4$ sh-4.4$ # а если нужно чтобы оно ещё и сказало в какой директории ошибка, то: sh-4.4$ sh-4.4$ rm dst/* # очистим для повторного прогона sh-4.4$ function merge() { local src_d=${1} dst_d="${2}"; for i in "${src_d}"/*/*; do local dst=${dst_d}/$(basename ${i}); if test -d "${i}"; then mkdir -p "${dst}"; merge "${i}" "${dst}"; else if test -e "${dst}"; then echo "Файл $(basename ${dst}), который мерджится из $(dirname ${i}) уже существует (и был смерджен из другой директории). Исправьте коммит." >&2; return 1; else ln -T "${i}" "${dst}"; fi; fi; done; } sh-4.4$ merge src dst Файл 1, который мерджится из src/dir3 уже существует (и был смерджен из другой директории). Исправьте коммит. sh-4.4$ sh-4.4$ # либо, чтобы сначала прогнало всё (и показало все фейлы), а потом сфейлилось, то: sh-4.4$ sh-4.4$ rm dst/* # очистим для повторного прогона sh-4.4$ function merge() { local status=0; local src_d=${1} dst_d="${2}"; for i in "${src_d}"/*/*; do local dst=${dst_d}/$(basename ${i}); if test -d "${i}"; then mkdir -p "${dst}"; merge "${i}" "${dst}"; else if test -e "${dst}"; then echo "Файл $(basename ${dst}), который мерджится из $(dirname ${i}) уже существует (и был смерджен из другой директории). Исправьте коммит." >&2; status=1; else ln -T "${i}" "${dst}"; fi; fi; done; return ${status}; } sh-4.4$ merge src dst Файл 1, который мерджится из src/dir3 уже существует (и был смерджен из другой директории). Исправьте коммит. Файл 2, который мерджится из src/dir3 уже существует (и был смерджен из другой директории). Исправьте коммит. sh-4.4$