#!/bin/bash # Try to hardlink a file into a directory, fallback to copy on failure. # # Hardlink-or-copy the source file in the first argument into the # destination directory in the second argument, using the basename in # the third argument as basename for the destination file. If the third # argument is missing, use the basename of the source file as basename # for the destination file. # # In either case, remove the destination prior to doing the # hardlink-or-copy. # # Note that this is NOT an atomic operation. set -e main() { local src_file="${1}" local dst_dir="${2}" local dst_file="${3}" if [ -n "${dst_file}" ]; then dst_file="${dst_dir}/${dst_file}" else dst_file="${dst_dir}/${src_file##*/}" fi mkdir -p "${dst_dir}" rm -f "${dst_file}" ln -f "${src_file}" "${dst_file}" 2>/dev/null \ || cp -f "${src_file}" "${dst_file}" } main "${@}"