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