#!/bin/sh -e install_files() { local target_dir="$1" local source_dir="$(readlink -f "${2:-.}")" local target_filename_prefix="${3}" mkdir -vp "${target_dir}" target_dir="$(readlink -f "${target_dir}")" if [ ! -d "${source_dir}" ]; then echo "Source directory ${source_dir} does not exist, skipping." return fi ( cd "${source_dir}" for f in "${source_dir}"/*; do case "$(basename "$f")" in dotfiles) install_files "${target_dir}" "$f" . ;; *.jq) tmpfile="$(mktemp)" if [ -f "$f" ]; then tmpfile="$(mktemp)" target_file="${target_dir}/$(basename "$f" .jq)" if [ -f "$target_file" ]; then cat "$target_file" else echo "{}" fi | jq "$(cat "$f")" > "$tmpfile" mv -v "$tmpfile" "$target_file" else echo "Expected source file with .jq extension not to be a directory." exit 1 fi ;; *) if [ -d "$f" ]; then install_files "${target_dir}/${target_filename_prefix}$(basename "$f")" "$f" else cp -v "$f" "${target_dir}/${target_filename_prefix}$(basename "$f")" fi ;; esac done ) } ### install_files "${HOME}" home install_files "/etc" etc