From 57c9e817ba6f5cebd4306479ed5d8a79fac376fa Mon Sep 17 00:00:00 2001 From: q Date: Sun, 14 May 2017 21:24:04 +0300 Subject: [PATCH] more cp-like behaviour --- files/cp-progress | 46 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/files/cp-progress b/files/cp-progress index 0615d5b..751f92f 100755 --- a/files/cp-progress +++ b/files/cp-progress @@ -31,24 +31,48 @@ getsize() { if [[ "$NOCOUNT" -eq 1 ]]; then echo 0 else - fastdu -s "${SRC[@]}" + fastdu -s "$@" fi } -# if 1 input, and is file, copy as file +copy_file() { + pv "$1" > "$2" + chmod --reference="$1" "$2" + chown --reference="$1" "$2" +} + +copy_dir() { + mkdir -p "$2" + chmod --reference="$1" "$2" + chown --reference="$1" "$2" + mysize=$( getsize "$1" ) + TGT_ABS=$( readlink -f "$2" ) + pushd "$1" &> /dev/null + tar -c "." | pv -s $mysize | tar -x --strip-components=1 -C "$TGT_ABS" + popd &> /dev/null +} + +copy_to() { + if [[ -f "$1" ]]; then # file to folder + copy_file "$1" "$2" + else # folder to folder + copy_dir "$1" "$2" + fi +} if [[ ${#SRC[@]} -eq 1 ]]; then # only one input - if [[ -f ${SRC[0]} ]]; then # its a file - if [[ ! -d "$TGT" ]]; then # target is not a dir - pv "${SRC[0]}" > "$TGT" - chmod --reference="${SRC[0]}" "$TGT" - chown --reference="${SRC[0]}" "$TGT" - exit $? - fi + if [[ ! -d "$TGT" ]]; then # target is not a (existing) dir + copy_to "${SRC[0]}" "$TGT" + exit $? fi fi # Otherwise, create folder, and copy in it -[[ -f "$TGT" ]] && { echo Target can only be a folder; exit 1; } +[[ -f "$TGT" ]] && { echo Copying multiple sources: Target can only be a folder; exit 1; } mkdir -p "$TGT" -tar -c "${SRC[@]}" | pv -s $( getsize ) | tar -x -C "$TGT" +for SRC_THIS in "${SRC[@]}"; do + SRC_BASE=$( basename "$SRC_THIS") + echo "$SRC_THIS" + copy_to "$SRC_THIS" "$TGT"/"$SRC_BASE" +done +