#!/usr/bin/env bash # # Author: Lilian Besson # License: GPLv3 # Online: https://perso.crans.org/besson/bin/CP-git # Online(2): https://bitbucket.org/lbesson/bin/src/master/CP-git # Date: 24-02-2021 # # A small wrapper around the output of the 'rsync' command, adding colors for interesting parts. # Can be save to ~/bin/CP-git for example (or anywhere in your path). # # Perfect replacement for 'cp', notable improvement are: # - the ability to copy to and from distant location (if it is reachable by SSH), # - print the current file transfer (when file is sent, not continuously updated, but rsync is able to, I could improve) # - exclude .git by default (if it exists) # - follow your .gitignore files to exclude files untracked by your current Git folder (if it exists) # - WARNING: this means that a well written .gitignore for LaTeX projects will NOT send the PDF! # - it pretty prints in full ANSI colors to highlight different information of rsync! # - notify-send when copy is done! # - logs the command to /tmp/CP.log, in case you want to find again what you sent 3h ago # # More features! # - You can use this script in your Makefile, to add rules to send files over the network easily: #SHELL=/usr/bin/env /bin/bash #send_zamok: # CP-git ./ ${Szam}bin/ # version='.4' LANG='en' # http://redsymbol.net/articles/unofficial-bash-strict-mode/ set -euo pipefail GREP="grep --color=always --line-buffered" # GREP="grep --color=always" # FIXME ? echo -e "${reset}CP: receiving the argument(s) $u${black}${@}${reset}" echo -e "CP: receiving the argument(s) ${@}" >> /tmp/CP.log # Change in the next line the default options for rsync # and change in the next lines the colors (ANSI Colors, in GREP_COLOR) for separate parts of the output (/usr/bin/rsync \ --cvs-exclude \ $([ -d .git ] && echo '--exclude=.git' ) \ $([ -f .gitignore ] && echo '--exclude-from=.gitignore' ) \ $(ls *.pdf &>/dev/null && echo '--include=*.pdf' ) \ --ipv4 \ --verbose \ --times \ --perms \ --compress \ --human-readable \ --progress \ --archive \ "$@" \ 2>&1) \ | $GREP -vP "^\s*((\[|\]|\(|\))\s*)+$" \ | GREP_COLOR="37" $GREP -P "^[\.\-_0-9a-zA-Z/]+$|$" \ | GREP_COLOR="4;01;32" $GREP -P "^(sending|sent|total).*|$" \ | GREP_COLOR="01;33" $GREP -P "[\.0-9]+.B/s|$" \ | GREP_COLOR="7;01;36" $GREP -P "^[ \t]*[\.0-9]+[KMGT]?|$" \ | GREP_COLOR="01;35" $GREP -P "to.check=[0-9]+/[0-9]+|$" \ | GREP_COLOR="01;30" $GREP -P "xfer#[0-9]+|$" \ | GREP_COLOR="01;36" $GREP -P "[0-9]:[0-9][0-9]:[0-9][0-9]|$" \ | GREP_COLOR="01;35" $GREP -P "^[0-9]+%|$" \ | GREP_COLOR="7;01;34" $GREP -P "100%|$" echo -e "\n${reset}${blue}CP sent successfully the files from input command $u${black}${@}${reset}" notify-send -- "CP successfully sent the files, from input command: ${@}" || echo "Failed to send notification" >/dev/stderr