36 lines
924 B
Plaintext
36 lines
924 B
Plaintext
|
#!/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 "${@}"
|