| #!/usr/bin/env 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 "${@}" |