From 92e72f91d4dcddbc4415a5ba7715672142c5b66e Mon Sep 17 00:00:00 2001 From: Michael Krayer Date: Thu, 25 Mar 2021 17:17:36 +0100 Subject: [PATCH] initial commit --- icp | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100755 icp diff --git a/icp b/icp new file mode 100755 index 0000000..dcd3b18 --- /dev/null +++ b/icp @@ -0,0 +1,75 @@ +#!/bin/bash +usage() { + echo >&2 "Usage: $(basename $0) [OPTION] SOURCE... DEST" + echo >&2 "Copy like cp, but use rsync in the background." + echo >&2 "Options:" + echo >&2 " -h print this help message" + echo >&2 " -n print rsync command and perform a dry-run" + echo >&2 " -r copy directories recursively" + echo >&2 " -v verbose output" + echo >&2 "Positional arguments:" + echo >&2 " SOURCE file/directory to copy" + echo >&2 " DEST target directory or filename (if only one SOURCE)" +} +# Error codes: rsync compatible +EXIT_SUCCESS=0 # rsync: Success +EXIT_INVALID_OPTION=1 # rsync: Syntax or usage error +EXIT_INVALID_PATH=3 # rsync: Errors selecting input/output files, dirs +# Argument parsing: +# -validate arguments +# -get flags +# -remove trailing slash from directories +flag_recursive=0 +flag_dryrun=0 +rsync_opt=("-lptgoD") +rsync_arg=() +for arg in "$@" +do + if [[ "$arg" == "-h" ]];then + usage + exit $EXIT_SUCCESS + elif [[ "$arg" == "-r" ]];then + flag_recursive=1 + rsync_opt+=("-r") + elif [[ "$arg" == "-v" ]];then + rsync_opt+=("-v") + elif [[ "$arg" == "-n" ]];then + flag_dryrun=1 + rsync_opt+=("-nv") + elif [[ -f "$arg" ]];then + rsync_arg+=("$arg") + elif [[ -d "$arg" ]];then + [[ "$arg" == */ ]] && arg="${arg::-1}" + rsync_arg+=("$arg") + elif [[ "$arg" == -* ]];then + echo >&2 "Invalid option: $arg" + exit $EXIT_INVALID_OPTION + else + echo >&2 "Not a file or directory: $arg" + exit $EXIT_INVALID_PATH + fi +done + +# If last argument (target) is a directory +# add a trailing slash +if [[ -d "${rsync_arg[-1]}" ]];then + rsync_arg[-1]="${rsync_arg[-1]}/" +fi + +# If this is not a dry-run, add a nice overall +# progress bar +if [[ "$flag_dryrun" -eq 0 ]]; then + rsync_opt+=("--info=progress2") +fi + +# Construct command +cmd="rsync ${rsync_opt[@]} ${rsync_arg[@]}" + +# Print the command to stdout if this is a dry-run +if [[ "$flag_dryrun" -eq 1 ]]; then + echo $cmd +fi + +# Do the work and return rsync exit code +eval $cmd +exit $?