############################################################################## # help functions ############################################################################### bobaman() { cat << EOF BorgBackup alias and functions (by Djan GICQUEL) --- bobals With argument, list all files of an archive/Without argument, list archives in repo bobagrepls List the archives of the repository with a filter as argument bobainfoa Get information of an archive in argument bobainfor Get information of a repository bobainfolast Get info from last archive bobainfotail Get info from the lasts 5 archives bobainfoall Get info from all archives in the repository (can be long and cpu intensive) bobaeditrepoinfo Create the information file outside of the repo folder (~/.config/borg/repoinfo/) The file can contain any relevant information about the repo,commands,comments... bobarepoinfo Display the information file about the repo located in ~/.config/borg/repoinfo/ bobagencachedirfile Create CACHEDIR.TAG file into the current folder bobadel Delete the archive in argument bobadelast Delete the last archive in the repository bobacheckrepo Check the repo consistency without repairing it (to avoid data lost) bobamount Mount archive in argument in the home dir of the current user bobamountfirst Mount first archive in the home dir of the current user bobamountlast Mount last archive in the home dir of the current user bobasearchinrepo Search for a file in the repository, the function will display a list of all archives that contain the match bobasearchinarchive Search for a file in the archive in argument, displaying full path in the archive 1st argument: archive, 2nd argument: text to find bobadurationr Show name and backup duration for all archive in the current repo (can be long and cpu intensive) bobadur List the name of all archives and sizes (O, C, D) (can be long and cpu intensive) bobalstimes List all archives with dates and times creation bobadeleter Mass archives deleting bobagrepdeleter Mass archives deleting with filter as argument bobarenamer Mass archives renaming bobagreprenamer Mass archives renaming with filter as argument bobaextractallfiles Extract all versions found of a file given in parameter bobacachedel Delete the cache dir of a repository (do not delete any archive) bobasecuritydel Delete the security folder from a repository (do not delete any archive) bobapassphrase Enter passphrase that will be used all env var by all borg repo in the same terminal EOF } bobaaide() { cat << EOF BorgBackup alias and functions (by Djan GICQUEL) --- bobals Lister les archives du dépôt bobagrepls Lister les archives du dépôt avec un filtre en argument bobainfoa Obtenir les informations d’une archive en argument bobainfor Obtenir les informations d’un dépôt bobainfolast Obtenir les informations de la dernière archive bobainfotail Obtenir les informations des 5 dernières archives bobainfoall Affiche les infos de toutes les archives du dépôt (peut être long) bobaeditrepoinfo Créer le fichier d'information en dehors du dépôt (~/.config/borg/repoinfo/) Le fichier peut contenir toute information pertinente sur le dépôt, des commandes, des commentaires... bobarepoinfo Affiche le fichier d'information du dépôt situé dans ~/.config/borg/repoinfo/ bobagencachedirfile Créer un fichier CACHEDIR.TAG dans le dossier courant bobadel Supprimer l'archive en paramètre bobadelast Supprimer la dernière archive du dépôt bobacheckrepo Vérifier la consistance d'un dépôt sans le réparer (pour éviter les pertes de donnée) bobamount Monter une archive en paramètre dans le home de l'utilisateur courant bobamountfirst Monter la première archive dans le home de l'utilisateur courant bobamountlast Monter la dernière archive dans le home de l'utilisateur courant bobasearchinrepo Chercher un fichier (en argument) dans le dépôt, affiche le nom de toutes les archives qui contienne le fichier bobasearchinarchive Chercher un fichier dans une archive en argument, affiche le chemin dans l'archive bobadurationr Montrer le nom de toutes les archives et le temps de sauvegarde bobadur Lister le nom de toutes les archives et leurs tailles (originale, compressée, dédupliquée) bobalstimes Lister toutes les archives du dépôt avec les dates et heures de création bobadeleter Supprimer facilement plusieurs archives d'un dépôt bobagrepdeleter Supprimer facilement plusieurs archives d'un dépôt avec un filtre en argument bobarenamer Renommer en masses les archives d'un dépôt bobagreprenamer Renommer en masses les archives d'un dépôt avec un filtre en argument bobaextractallfiles Extraire toutes les versions d'un fichier donné en argument bobacachedel Supprimer le cache d'un dépôt (ne supprime aucune archive) bobasecuritydel Supprimer le dossier « security » d'un dépôt (ne supprime aucune archive) bobapassphrase Entrer une phrase de passe en tant que variable d'environnement qui sera utilisé par les dépôts pour le terminal courant EOF } alias bobahelp="bobaman" ############################################################################### # generals functions ############################################################################### TestBorgRepo() { if [ ! -f "config" ]; then TestBorgErr=1 fi if [ ! -d "data" ]; then TestBorgErr=1 fi if [ "$TestBorgErr" = "1" ];then echo "Not in a borg repo." echo "Exiting in 5 seconds." sleep 5 return fi } UnMount() { fusermount -u -z "$mountpoint" sleep 5 rmdir "$mountpoint" } DirExists() { if [ ! -d "$1" ]; then echo "Error, directory $1 missing." echo "Exiting.";sleep 10 exit fi } bobapassphrase() { stty -echo read -p "Enter borg passphrase : " BORG_PASSPHRASE stty echo echo "" export BORG_PASSPHRASE } bobagencachedirfile() { echo "Signature: 8a477f597d28d172789f06886806bc55" > CACHEDIR.TAG && echo "CACHEDIR.TAG created" } ############################################################################### # list and infos functions ############################################################################### bobals() { TestBorgRepo borg list --short ./ } bobalstimes() { TestBorgRepo borg list --format {barchive}{SPACE}{SPACE}{TAB}{start}{NL} ./ } bobagrepls() { TestBorgRepo borg list --short --glob-archives "$1" ./ } bobainfoa() { TestBorgRepo borg info ./::$1 } bobaeditrepoinfo() { repoid=$(cat config | grep id | cut -f3 -d" ") mkdir -p $HOME/.config/borg/repoinfo/ $EDITOR $HOME/.config/borg/repoinfo/$repoid } bobarepoinfo() { repoid=$(cat config | grep id | cut -f3 -d" ") cat $HOME/.config/borg/repoinfo/$repoid } bobainfor() { TestBorgRepo borg info ./ } bobainfolast() { TestBorgRepo archive=$(borg list --short ./ | tail -n 1) borg info .::"$archive" } bobainfotail() { TestBorgRepo for archive in $(borg list --short ./ | tail -n 5);do echo "----------------------------------------------------" borg info .::$archive echo "----------------------------------------------------" done } bobainfoall() { TestBorgRepo for borgarchive in $(borg list --short ./);do echo "------------------------------------------------------------------------------" borg info .::$borgarchive echo "------------------------------------------------------------------------------" done } bobastats() { TestBorgRepo if ! which jq ;then echo "Install jq and retry." else echo "name,duration,original_size,compressed_size,deduplicated_size" > borg-stats-$(date +%Y-%m-%d).csv for borgarchive in $(borg list --short ./);do echo "Processing "$borgarchive..."" borg info --json .::"$borgarchive" | jq -r '.archives[] | [.name,.duration,.stats.original_size,.stats.compressed_size,.stats.deduplicated_size] | @csv' >> "borg-stats-$(date +%Y-%m-%d).csv" done fi } bobadurationr() { TestBorgRepo for borgarchive in $(borg list --short ./);do borg info .::$borgarchive | grep "Archive name" borg info .::$borgarchive | grep "Duration" echo "" done } bobadur() { TestBorgRepo echo "Prefered units ?" select choice in B KB MB GB;do case $choice in B) echo "Processing all archives..." borg info --json --glob-archives "*" ./ | jq -r '.archives[] | [.name,(.stats.original_size),(.stats.compressed_size),(.stats.deduplicated_size)] | @csv' >> ./bobadurtmp.csv column --separator "," --table --table-columns "NAME,ORIG (B),COMP (B),DEDUP (B)" ./bobadurtmp.csv echo "" rm -i ./bobadurtmp.csv break ;; KB) echo "Processing all archives..." borg info --json --glob-archives "*" ./ | jq -r '.archives[] | [.name,(.stats.original_size/1000|round/100),(.stats.compressed_size/1000|round/100),(.stats.deduplicated_size/1000|round/100)] | @csv' >> ./bobadurtmp.csv column --separator "," --table --table-columns "NAME,ORIG (KB),COMP (KB),DEDUP (KB)" ./bobadurtmp.csv echo "" rm -i ./bobadurtmp.csv break ;; MB) echo "Processing all archives..." borg info --json --glob-archives "*" ./ | jq -r '.archives[] | [.name,(.stats.original_size/1000/1000|round/100),(.stats.compressed_size/1000/1000|round/100),(.stats.deduplicated_size/1000/1000|round/100)] | @csv' >> ./bobadurtmp.csv column --separator "," --table --table-columns "NAME,ORIG (MB),COMP (MB),DEDUP (MB)" ./bobadurtmp.csv echo "" rm -i ./bobadurtmp.csv break ;; GB) echo "Processing all archives..." borg info --json --glob-archives "*" ./ | jq -r '.archives[] | [.name,(.stats.original_size/1000/1000/1000|round/100),(.stats.compressed_size/1000/1000/1000|round/100),(.stats.deduplicated_size/1000/1000/1000|round/100)] | @csv' >> ./bobadurtmp.csv column --separator "," --table --table-columns "NAME,ORIG (GB),COMP (GB),DEDUP (GB)" ./bobadurtmp.csv echo "" rm -i ./bobadurtmp.csv break ;; esac done } ############################################################################### # mount functions ############################################################################### bobamount() { TestBorgRepo mountpoint="$HOME/borg_$1" mkdir $mountpoint echo "Archive : $1" borg mount ./::"$1" $mountpoint read -p "Presser une touche pour démontage" CONT UnMount } bobamountfirst() { TestBorgRepo archive=$(borg list ./ --short | head -n 1) mountpoint="$HOME/borg_$archive" mkdir "$mountpoint" borg mount ./::"$archive" "$mountpoint" read -p "Presser une touche pour démontage" CONT UnMount } bobamountlast() { TestBorgRepo archive="$(borg list ./ --short | tail -n 1)" mountpoint="$HOME/borg_$archive" mkdir "$mountpoint" borg mount ./::"$archive" "$mountpoint" read -p "Presser une touche pour démontage" CONT UnMount } ############################################################################### # search functions ############################################################################### bobasearchinrepo() { TestBorgRepo for borgarchive in $(borg list --short ./);do borggrep=$(borg list --short .::$borgarchive | grep -i $1) if [ $? = 0 ];then echo "" echo "-- $borgarchive --" echo "$borggrep" echo "" fi done } bobasearchinarchive() { TestBorgRepo borg list --short .::"$1" | grep -i "$2" } bobacachedel() { TestBorgRepo repoid=$(cat config | grep id | cut -f3 -d" ") echo "Repo ID : "$repoid;sleep 5 DirExists $HOME/.cache/borg/$repoid rm -r $HOME/.cache/borg/$repoid } bobasecuritydel() { TestBorgRepo repoid=$(cat config | grep id | cut -f3 -d" ") echo "Repo ID : "$repoid;sleep 5 DirExists $HOME/.config/borg/security/$repoid rm -r $HOME/.config/borg/security/$repoid } ############################################################################### # modify repo ############################################################################### bobadel() { TestBorgRepo borg delete ./::$1 } bobadelast() { TestBorgRepo archive=$(borg list ./ --short | tail -n 1) borg delete .::$archive } bobacheckrepo() { TestBorgRepo borgrepo="${PWD##*/}" borg check -v . } ############################################################################### # mass functions ############################################################################### bobadeleter() { TestBorgRepo borgrepo="${PWD##*/}" file="borgdelete_$borgrepo.sh" borg list --short . >> $file if [ "$?" != "0" ]; then echo "Error generating list of archives. Exiting." && return;fi sed -i 's/^/#/' $file #add "#" in the beginnning of all lines echo "" echo "In the next screen just uncomment lines you want to delete and save your file";sleep 3 echo "" $EDITOR $file sed -i '/^#/d' $file #remove lines without "#" sed -i 's/^/"/' $file # add quotes in the beginnning of lines sed -i 's/$/"/' $file # add quotes ine the end of lines paste -s -d " " $file > file_temp rm $file;mv file_temp $file sed -i '1s/^/borg delete -v --list .::/' $file sed -i '1s/^/\n/' $file sed -i '1s/^/\n/' $file sed -i '1s/^/#Watch out you'\''re doing, there won'\''t be other confirmation\n/' $file sed -i '1s/^/\n/' $file sed -i '1s/^/### BORG DELETER ###\n/' $file $EDITOR $file sh $file rm $file } bobagrepdeleter() { TestBorgRepo borgrepo="${PWD##*/}" file="borgdelete_$borgrepo.sh" borg list --short --glob-archives "$1" ./ >> $file if [ "$?" != "0" ]; then echo "Error generating list of archives. Exiting." && rm $file && return;fi sed -i 's/^/"/' $file sed -i 's/$/"/' $file sed -i 's/^/#borg delete -v --list .::/' $file sed -i '1s/^/\n/' $file sed -i '1s/^/\n/' $file sed -i '1s/^/#Watch out you'\''re doing, there won'\''t be other confirmation.\n/' $file sed -i '1s/^/#Just uncomment lines you want to delete and save your file.\n/' $file sed -i '1s/^/\n/' $file sed -i '1s/^/### BORG GREP DELETER ###\n/' $file $EDITOR $file sh $file rm $file } # mass archive renaming bobarenamer() { TestBorgRepo which paste || echo "Paste command not found." exit borgrepo="${PWD##*/}" file="file_$borgrepo.txt" originals="originals_$borgrepo.txt" script="borgrenamer_$borgrepo.sh" echo "Generating list of archives..." borg list --short . >> $originals if [ "$?" != "0" ]; then echo "Error generating list of archives. Exiting." && return;fi cp $originals $file $EDITOR $file sed -i 's/^/"/' $originals sed -i 's/$/"/' $originals sed -i 's/^/borg rename -v .::/' $originals sed -i 's/^/"/' $file sed -i 's/$/"/' $file paste -d" " $originals $file > $script sed -i '1s/^/\n/' $script sed -i '1s/^/\n/' $script sed -i '1s/^/\n/' $script sed -i '1s/^/#Modifications in this file will be applied\, comment all to cancel\.\n/' $script sed -i '1s/^/### BORG RENAMER ###\n/' $script $EDITOR $script echo "Renaming..." sh $script rm $file rm $originals rm $script } bobagreprenamer() { TestBorgRepo which paste || echo "Paste command not found." exit borgrepo="${PWD##*/}" file="file_$borgrepo.txt" originals="originals_$borgrepo.txt" script="borgrenamer_$borgrepo.sh" echo "Generating list of archives..." borg list --glob-archives "$1" --short . >> $originals if [ "$?" != "0" ]; then echo "Error generating list of archives. Exiting." && return;fi cp $originals $file $EDITOR $file sed -i 's/^/"/' $originals sed -i 's/$/"/' $originals sed -i 's/^/borg rename -v .::/' $originals sed -i 's/^/"/' $file sed -i 's/$/"/' $file paste -d" " $originals $file > $script sed -i '1s/^/\n/' $script sed -i '1s/^/\n/' $script sed -i '1s/^/\n/' $script sed -i '1s/^/#Modifications in this file will be applied\, comment all to cancel\.\n/' $script sed -i '1s/^/### BORG RENAMER ###\n/' $script $EDITOR $script echo "Renaming..." sh $script rm $file rm $originals rm $script } bobaextractallfiles() { TestBorgRepo export BORG_REPO=$(echo $PWD) export BorgName=$(echo ${PWD##*/}) mkdir -p $HOME/BorgExtract_"$BorgName"/;cd $HOME/BorgExtract_"$BorgName" for ar in $(borg list --short $BORG_REPO);do path=$(borg list --glob-archives "$1" --format '{path}{NL}' ::$ar) if [ $? = 0 ];then mkdir -p $ar;cd $ar borg extract --list ::$ar $path cd .. fi done cd $BORG_REPO }