diff --git a/.local/bin/scripts/dif b/.local/bin/scripts/dif index b28e85b..1cad345 100755 --- a/.local/bin/scripts/dif +++ b/.local/bin/scripts/dif @@ -1,19 +1,31 @@ -#!/bin/bash -ex +#!/bin/bash -e # interactive diff with pagination and nice coloring -# TODO diff sqlite repos with sqldiff -mime="$(file --brief --mime "$1" "$2")" -case "$mime" in -(*audio*) - ff() { ffprobe -loglevel warning -print_format default=noprint_wrappers=1 -show_format -pretty "$@"; } +declare -a files +while test $# -gt 0 +do test "$1" == "--" && shift && + command="$@" && break + files+=("$1") + shift +done +{ +if ! test "$command"; then + mime="$(file --brief --mime "${files[@]}")" + case "$mime" in + (*audio*) command="ffprobe -loglevel warning -print_format default=noprint_wrappers=1 -show_format -pretty";; + (image/*) command="exiftool";; + (*sqlite*) sqldiff --summary "${files[@]}" | grep -v '0 changes, 0 inserts, 0 deletes';; # TODO syntax highlighting for INSERT/UPDATE/DELETE + (text/*) + # Use wiked-diff only for text <10MB + if test 10000000 -gt "$(stat --format=%s *.geojson | paste -s -d'+' | bc)" + then wiked-diff "${files[@]}" + else diff --color=always --unified=1 --report-identical-files "${files[@]}" + fi;; + (*) diff-color --report-identical-files "${files[@]}";; + esac +fi +if test "$command"; then + echo "Generated through $command" $(test $(tput cols) -gt 120 && echo "diff --color=always --side-by-side" || echo "diff-color") \ - --report-identical-files --label="$1" --label="$2" <(ff "$1") <(ff "$2") - ;; -(*sqlite*) sqldiff "$@" ;; -(text/*) - # Use wiked-diff only for text <10MB - if test 10000000 -gt "$(stat --format=%s *.geojson | paste -s -d'+' | bc)" - then wiked-diff "$@" - else diff --color=always --unified=1 --report-identical-files "$@" - fi;; -(*) diff-color --report-identical-files "$@";; -esac | less --RAW-CONTROL-CHARS --quit-on-intr --quit-if-one-screen + --report-identical-files --label="${files[0]}" --label="${files[1]}" <($command "${files[0]}") <($command "${files[1]}") +fi +} | less --RAW-CONTROL-CHARS --quit-on-intr --quit-if-one-screen diff --git a/.local/bin/scripts/duploc b/.local/bin/scripts/duploc index 0503069..e01c9f8 100755 --- a/.local/bin/scripts/duploc +++ b/.local/bin/scripts/duploc @@ -1,10 +1,10 @@ -#!/bin/sh -e +#!/bin/sh # Delete files under current or given path which exist elsewhere as listed in the locate database # Matches first by name, then by checksum (currently inefficiently via md5) case $1 in ([0-9]|[0-9][0-9]) threshold=$1; shift;; esac find "$@" -size +${threshold:-50}M -type f -exec sh -c "IFS=$'\n'"' filepath="{}" - target="$(basename "$filepath" | synct-unarchive)" + target="$(synct-unarchive "$filepath")" highlight "$filepath" for existing in $(locate -b "$target") do test "$(realpath "$target")" != "$(realpath "$existing")" -a -f "$existing" && test "$(md5sum "$existing" | cut -d\ -f1)" = "$(md5sum "$filepath" | cut -d\ -f1)" && echo "Found duplicate at $existing" && rm -vi "$filepath" && break