# i for insensitive. the rest from
# X means dont remove the current screenworth of output upon exit
# R means to show colors n things
+# a useful flag is -F aka --quit-if-one-screen
export LESS=RXij12
export SYSTEMD_LESS=$LESS
fi
+
+
mysrc() {
local path dir file
path=$1
mysrc /a/bin/small-misc-bash/ll-function
mysrc /a/bin/distro-functions/src/package-manager-abstractions
+# things to remember:
+# ALT-C - cd into the selected directory
+# CTRL-T - Paste the selected file path into the command line
+#
+# good guide to some of its basic features is the readme file
+# https://github.com/junegunn/fzf
+
+# if [[ -s /usr/share/doc/fzf/examples/key-bindings.bash ]]; then
+# source /usr/share/doc/fzf/examples/key-bindings.bash
+# fi
# * functions
# we have ~33 buttons as of this writing, so lets
# prune down the history every once in a while.
if (( start > 500 )); then
- tac ~/.cdirs | awk '!seen[$0]++' | head -n 200 | sponge ~/.cdirs
+ tac ~/.cdirs | awk '!seen[$0]++' | head -n 200 | tac | sponge ~/.cdirs || [[ $? == 141 ]]
fi
for (( j=$start; j >= 0; j-- )); do
fi
read -r -N 1 input
if [[ $input != $'\n' ]]; then
- c ${buttondirs[$input]}
+ c "${buttondirs[$input]}"
fi
}
# back list
ssh-copy-id $1
}
+# ya, hacky hardcoded hostnames in 2023. we could do better
+hssh-update() {
+ for host in kd x3.office.fsf.org syw; do
+ e $host
+ scp /b/fai/fai/config/files/usr/local/bin/hssh/IANK root@$host:/usr/local/bin/hssh
+ done
+}
+
a() {
local x
x=$(readlink -nf "${1:-$PWD}")
}
vp9() {
- local f out outdir in
+ local f out outdir in fname origdir skip1
+ origdir="$PWD"
outdir=vp9
- case $1 in
- --out)
- outdir=$2
- shift 2
- ;;
- esac
+ skip1=false
+ while [[ $1 == -* ]]; do
+ case $1 in
+ # if we got interrupted after 1st phase
+ -2)
+ skip1=true
+ shift
+ ;;
+ --out)
+ outdir=$2
+ shift 2
+ ;;
+ esac
+ done
m mkdir -p $outdir
+ # first pass only uses about 1 cpu, so run in parallel
for f; do
- out=$PWD/$outdir/$f
- in=$PWD/$f
- m cd $(mktemp -d)
- pwd
- m ffmpeg -threads 0 -i $in -g 192 -vcodec libvpx-vp9 -vf scale=-1:720 -max_muxing_queue_size 9999 -b:v 750K -pass 1 -an -f null /dev/null
- m ffmpeg -y -threads 0 -i $in -g 192 -vcodec libvpx-vp9 -vf scale=-1:720 -max_muxing_queue_size 9999 -b:v 750K -pass 2 -c:a libvorbis -qscale:a 5 $out
- cd -
+ {
+ fname="${f##*/f}"
+ if [[ $f == /* ]]; then
+ in="$f"
+ else
+ in=$origdir/$f
+ fi
+ out="$origdir/$outdir/$fname"
+ mkdir -p /tmp/vp9/$fname
+ cd /tmp/vp9/$fname
+ if ! $skip1 && [[ ! -s ffmpeg2pass-0.log ]]; then
+ # -nostdin or else wait causes ffmpeg to go into stopped state. dunno why, random stackoverflow answer.
+ m ffmpeg -nostdin -hide_banner -loglevel error -i $in -g 192 -vcodec libvpx-vp9 -vf scale=-1:720 -max_muxing_queue_size 9999 -b:v 750K -pass 1 -an -f null /dev/null
+ fi
+ if [[ -e $out ]]; then rm -f $out; fi
+ m ffmpeg -nostdin -hide_banner -loglevel error -y -i $in -g 192 -vcodec libvpx-vp9 -tile-rows 2 -vf scale=-1:720 -max_muxing_queue_size 9999 -b:v 750K -pass 2 -c:a libvorbis -qscale:a 5 $out
+ } &
done
+ wait -f
+ cd "$origdir"
}
utcl() { # utc 24 hour time to local hour 24 hour time
}
-# for running in a fai rescue
+# for running in a fai rescue. iank specific.
kdrescue() {
d=vgata-Samsung_SSD_850_EVO_2TB_S2RLNX0J502123D
for f in $d vgata-Samsung_SSD_870_QVO_8TB_S5VUNG0N900656V; do
}
+chownme() {
+ s chown -R $USER:$USER "$@"
+}
+
# shellcheck disable=SC2032
chown() {
# makes it so chown -R symlink affects the symlink and its target.
d() { builtin bg "$@"; }
ccomp bg d
+# f would be more natural, but i already am using it for something
+z() { builtin fg "$@"; }
+ccomp fg z
+
+x() { builtin kill %%; }
+
dc() {
diff --strip-trailing-cr -w "$@" # diff content
}
done
}
+# df progress
+# usage: dfp MOUNTPOINT [SECOND_INTERVAL]
+# SECOND_INTERVAL defaults to 90
+dfp() {
+ # mp = mountpoint
+ local a b mp interval
+ mp=$1
+ interval=${2:-90}
+ if [[ ! $mp ]]; then
+ echo "dfp: error, missing 1st arg" >&2
+ return 1
+ fi
+ while true; do
+ a=$(df --output=used $mp | tail -n1)
+ sleep $interval
+ b=$(df --output=used $mp | tail -n1)
+ printf "used mib: %'d mib/min: %s\n" $(( b /1000 )) $(( (b-a) / (interval * 1000 / 60 ) ))
+ done
+}
+
# get ipv4 ip from HOST. or if it is already a number, return that
hostip() {
local host="$1"
diff -u /tmp/digdiff <(digsort $s2 "$@")
}
+# date in a format i like reading
dt() {
date "+%A, %B %d, %r" "$@"
}
dtr() {
date -R "$@"
}
-ccomp date dt dtr
+# date with all digits in a format i like
+dtd() {
+ date +%F_%T% "$@"
+}
+ccomp date dt dtr dtd
dus() { # du, sorted, default arg of
du -sh ${@:-*} | sort -h
printf "%s" "${arg}" |& hexdump -C
done
}
-# echo vars. print var including escapes, etc
+
+# echo variables. print var including escapes, etc, like xxd for variable
ev() {
if (( ! $# )); then
echo no args
}
ccomp tail etail etail2
+# ran into this online, trying it out
+detach() {
+ ( "$@" &>/dev/null & disown )
+}
+showkeys() {
+ ssh "$@" cat .ssh/authorized_keys{,2}
+}
# print exim old pids
update-exim4.conf -d /tmp/edev/etc/exim4 -o /tmp/edev/e.conf
}
+# exim grep in
+# show important information about incoming mail in the exim log
+egrin() {
+ sed -rn '/testignore|jtuttle|eximbackup/!s/^[^ ]+ ([^ ]+) [^ ]+ [^ ]+ <= ([^ ]+).*T="(.*)" from (<[^ ]+> .*$)/\1 \4\n \3/p' <${1:-/var/log/exim4/mainlog}
+}
+
+# 2nd line is message-id:
+egrinid() {
+ sed -rn '/testignore|jtuttle|eximbackup/!s/^[^ ]+ ([^ ]+) [^ ]+ [^ ]+ <= ([^ ]+).* id=([^ ]+) T="(.*)" from (<[^ ]+> .*$)/\1 \5\n \3\n \4/p' <${1:-/var/log/exim4/mainlog}
+}
+etailin() {
+ tail -F /var/log/exim4/mainlog | sed -rn '/testignore|jtuttle|eximbackup/!s/^[^ ]+ ([^ ]+) [^ ]+ [^ ]+ <= ([^ ]+).*T="(.*)" from (<[^ ]+> .*$)/\1 \4\n \3/p'
+}
+
-o -name .undo-tree-history -prune \) -type f 2>/dev/null
}
-# full path without resolving symlinks
+# usage ffconcat FILES_TO_CONCAT OUTPUT_FILE
+ffconcat() {
+ local tmpf
+ tmpf=$(mktemp)
+ printf "file '%s'\n" "$1" >$tmpf
+ while (( $# > 1 )); do
+ shift
+ printf "file '%s'\n" "$1" >>$tmpf
+ done
+ # https://trac.ffmpeg.org/wiki/Concatenate
+ ffmpeg -f concat -safe 0 -i $tmpf -c copy "$1"
+ rm $tmpf
+}
+ffremux() {
+ local tmpf tmpd
+ if (( $# == 0 )); then
+ echo ffremux error expected args >&2
+ return 1
+ fi
+ tmpd=$(mktemp -d)
+ for f; do
+ tmpf=$tmpd/"${f##*/}"
+ ffmpeg -i "$f" -c:v copy -c:a copy $tmpf
+ cat $tmpf >"$f"
+ done
+ rm -r $tmpd
+}
+
+
+
+# absolute path of file/dir without resolving symlinks.
+#
+# Most of the time, I want this where I would normally use readlink.
+# This is what realpath -s does in most cases, but sometimes it
+# actually resolves symlinks, at least when they are in /.
+#
+# Note, if run on a dir, if the final component is relative, it won't
+# resolve that. Use the below fpd for that.
+#
+# note: we could make a variation of this which
+# assigns to a variable name using eval, so that we don't have to do
+# x=$(fp somepath), which might save subshell overhead and look nice,
+# but I'm not going to bother.
fp() {
- local dir base
- base="${1##*/}"
- dir="${1%$base}"
- printf "%s/%s\n" $(cd $dir; pwd) "$base"
+ local initial_oldpwd initial_pwd dir base
+ initial_oldpwd="$OLDPWD"
+ initial_pwd="$PWD"
+ if [[ $1 == */* ]]; then
+ dir="${1%/*}"
+ base="/${1##*/}"
+ # CDPATH because having it set will cause cd to possibly print output
+ CDPATH= cd "$dir"
+ printf "%s%s\n" "$PWD" "$base"
+ CDPATH= cd "$initial_pwd"
+ OLDPWD="$initial_oldpwd"
+ else
+ printf "%s/%s\n" "$PWD" "$1"
+ fi
+}
+# full path of directory without resolving symlinks
+fpd() {
+ local initial_oldpwd initial_pwd dir
+ initial_oldpwd="$OLDPWD"
+ initial_pwd="$PWD"
+ dir="$1"
+ CDPATH= cd "$dir"
+ printf "%s%s\n" "$PWD" "$base"
+ cd "$initial_pwd"
+ OLDPWD="$initial_oldpwd"
}
rg() { grr "$@"; }
ccomp grep rg
+# recursive everything. search for files/dirs and lines. rs = easy chars to press
+re() {
+ local query
+ query="$1"
+ find "$@" -not \( -name .svn -prune -o -name .git -prune \
+ -o -name .hg -prune -o -name .editor-backups -prune \
+ -o -name .undo-tree-history -prune \) 2>/dev/null | grep -iP --color=auto "$query"
+ grr -m 5 "$@"
+}
+
hr() { # horizontal row. used to break up output
printf "$(tput setaf 5 2>/dev/null ||:)█$(tput sgr0 2>/dev/null||:)%.0s" $(eval echo "{1..${COLUMNS:-60}}")
echo
git push
}
-
ifn() {
- # insensitive find
+ local glob
+ glob="$1"
+ shift
+ find -L "$@" -not \( -name .svn -prune -o -name .git -prune \
+ -o -name .hg -prune -o -name .editor-backups -prune \
+ -o -name .undo-tree-history -prune \) -iname "*$glob*" 2>/dev/null
+}
+
+ifh() {
+ # insensitive find here. args are combined into the search string.
# -L = follow symlinks
find -L . -not \( -name .svn -prune -o -name .git -prune \
-o -name .hg -prune -o -name .editor-backups -prune \
mkct() {
mkc $(mktemp -d)
}
+# mkdir the last arg, cp the rest into it
+mkcp() {
+ mkdir -p "${@: -1}"
+ cp "${@:1:$#-1}" "${@: -1}"
+}
+mkmv() {
+ mkdir -p "${@: -1}"
+ mv "${@:1:$#-1}" "${@: -1}"
+}
mkt() { # mkdir and touch file
local path="$1"
# scp is insecure and deprecated.
scp() {
- rsync --inplace "$@"
+ rsync -Pt --inplace "$@"
}
ccomp rsync scp
fi
}
+# add annoyingly long argument which should be the default
+sedi() {
+ sed -i --follow-symlinks "$@"
+}
+
rmstrips() {
ssh fencepost head -n 300 /gd/gnuorg/EventAndTravelInfo/rms-current-trips.txt | less
}
fi
}
+# prometheus node curl
+pnodecurl() {
+ local host
+ host=${1:-127.0.0.1}
+ s curl --cert-type PEM --cert /etc/prometheus/ssl/prometheus_cert.pem --key /etc/prometheus/ssl/prometheus_key.pem --cacert /etc/prometheus/ssl/prom_node_cert.pem --resolve prom_node:9100:$host -v https://prom_node:9100/metrics
+}
+
tx() { # toggle set -x, and the prompt so it doesnt spam
if [[ $- == *x* ]]; then
set +x
# and changing directory, so we don't have any open
# directories or files that could cause problems when
# remounting.
-z() {
+zr() {
local tmp
tmp=$(type -p "$1")
if [[ $tmp ]]; then
_spark_echo
}
+pdfwc() { local f; for f; do echo "$f" $(pdfinfo "$f" | awk '/^Pages:/ {print $2}'); done }
# * misc stuff
if [[ $MAIL_HOST && $MAIL_HOST != "$HOSTNAME" ]]; then
ps_char="@ $ps_char"
fi
+ jobs_char=
+ if [[ $(jobs -p) ]]; then
+ jobs_char='j\j '
+ fi
# We could test if sudo is active with sudo -nv
# but then we get an email and log of lots of failed sudo commands.
# We could turn those off, but seems better not to.
if [[ ! $HISTFILE ]]; then
ps_char="NOHIST $ps_char"
fi
- PS1="${PS1%"${PS1#*[wW]}"} $psudo\[$ps_color\]$ps_char\[$term_nocolor\] "
+ PS1="${PS1%"${PS1#*[wW]}"} $jobs_char$psudo\[$ps_color\]$ps_char\[$term_nocolor\] "
# set titlebar. instead, using more advanced
# titelbar below
_title_escape="\033]0;"
fi
+ # make the titlebar be the last command and the current directory.
settitle () {
- # this makes it so we show the current command if
- # one is running, otherwise, show nothing
- if [[ $1 == prompt-command ]]; then
+
+ # These are some checks to help ensure we dont set the title at
+ # times that the debug trap is running other than the case we
+ # want. Some of them might not be needed.
+ if (( ${#FUNCNAME[@]} != 1 || ${#BASH_ARGC[@]} != 2 || $BASH_SUBSHELL != 0 )); then
return 0
fi
- if (( ${#BASH_ARGC[@]} == 1 && BASH_SUBSHELL == 0 )); then
- echo -ne "$_title_escape ${PWD/#$HOME/~} "
- printf "%s" "$*"
- echo -ne "\007"
+ if [[ $1 == prompt-command ]]; then
+ return 0
fi
+ echo -ne "$_title_escape ${PWD/#$HOME/~} "
+ printf "%s" "$*"
+ echo -ne "\007"
}
# note, this wont work: