|  | #!/bin/bash | 
|  | # | 
|  | # By Victor Orlikowski. Public domain. | 
|  | # | 
|  | # This script maintains snapshots of each pane's | 
|  | # history buffer, for each tmux session you are running. | 
|  | # | 
|  | # It is intended to be run by cron, on whatever interval works | 
|  | # for you. | 
|  |  | 
|  | # Maximum number of snapshots to keep. | 
|  | max_backups=12 | 
|  | # Names of sessions you may wish to exclude from snapshotting, | 
|  | # space separated. | 
|  | ignore_sessions="" | 
|  | # The directory into which you want your snapshots placed. | 
|  | # The default is probably "good enough." | 
|  | backup_dir=~/.tmux_backup/snapshot | 
|  |  | 
|  | ######################################################################## | 
|  |  | 
|  | # Rotate previous backups. | 
|  | i=${max_backups} | 
|  | while [[ ${i} != 0 ]] ; do | 
|  | if [ -d ${backup_dir}.${i} ] ; then | 
|  | if [[ ${i} = ${max_backups} ]] ; then | 
|  | rm -r ${backup_dir}.${i} | 
|  | else | 
|  | mv ${backup_dir}.${i} ${backup_dir}.$((${i}+1)) | 
|  | fi | 
|  | fi | 
|  | i=$((${i}-1)) | 
|  | done | 
|  |  | 
|  | if [ -d ${backup_dir} ] ; then | 
|  | mv ${backup_dir} ${backup_dir}.1 | 
|  | fi | 
|  |  | 
|  | ## Dump hardcopy from all windows in all available tmux sessions. | 
|  | unset TMUX | 
|  | for session in $(tmux list-sessions | cut -d' ' -f1 | sed -e 's/:$//') ; do | 
|  | for ignore_session in ${ignore_sessions} ; do | 
|  | if [ ${session} = ${ignore_session} ] ; then | 
|  | continue 2 | 
|  | fi | 
|  | done | 
|  |  | 
|  | # Session name can contain the colon character (":"). | 
|  | # This can screw up addressing of windows within tmux, since | 
|  | # target windows are specified as target-session:target-window. | 
|  | # | 
|  | # We use uuidgen to create a "safe" temporary session name, | 
|  | # which we then use to create a "detached" session that "links" | 
|  | # to the "real" session that we want to back up. | 
|  | tmpsession=$(uuidgen) | 
|  | tmux new-session -d -s "$tmpsession" -t "$session" | 
|  | HISTSIZE=$(tmux show-options -g -t "$tmpsession" | grep "history-limit" | awk '{print $2}') | 
|  | for win in $(tmux list-windows -t "$tmpsession" | grep -v "^\s" | cut -d' ' -f1 | sed -e 's/:$//'); do | 
|  | session_dir=$(echo "$session" | sed -e 's/ /_/g' | sed -e 's%/%|%g') | 
|  | win_spec="$tmpsession":"$win" | 
|  |  | 
|  | if [ ! -d ${backup_dir}/${session_dir}/${win} ] ; then | 
|  | mkdir -p ${backup_dir}/${session_dir}/${win} | 
|  | fi | 
|  |  | 
|  | for pane in $(tmux list-panes -t "$win_spec" | cut -d' ' -f1 | sed -e 's/:$//'); do | 
|  | pane_path=${backup_dir}/${session_dir}/${win}/${pane} | 
|  | pane_spec="$win_spec"."$pane" | 
|  |  | 
|  | tmux capture-pane -t "$pane_spec" -S -${HISTSIZE} | 
|  | tmux save-buffer ${pane_path} | 
|  |  | 
|  | if [ ! -s ${pane_path} ] ; then | 
|  | sleep 1 | 
|  | rm ${pane_path} | 
|  | fi | 
|  | done | 
|  | done | 
|  | tmux kill-session -t "$tmpsession" | 
|  |  | 
|  | done |