#!/usr/bin/env sh # Description: Create and verify checksums # # Note: On macOS, install the relevant checksum packages from Homebrew with: # brew install coreutils # # Details: # - selection: it will generate one file with the checksums and filenames # (and with paths if they are in another directory) # output checksum filename format: checksum_timestamp.checksum_type # - file: if the file is a checksum, the plugin does the verification # if the file is not a checksum, checksum will be generated for it # the output checksum filename will be filename.checksum_type # - directory: recursively calculates checksum for all the files in the dir # the output checksum filename will be directory.checksum_type # # Shell: POSIX compliant # Authors: ath3, Arun Prakash Jana selection=${NNN_SEL:-${XDG_CONFIG_HOME:-$HOME/.config}/nnn/.selection} resp=f chsum=md5 checksum_type() { echo "possible checksums: md5, sha1, sha224, sha256, sha384, sha512" printf "create md5 (m), sha256 (s), sha512 (S) (or type one of the above checksums) [default=m]: " read -r chsum_resp for chks in md5 sha1 sha224 sha256 sha384 sha512 do if [ "$chsum_resp" = "$chks" ]; then chsum=$chsum_resp return fi done if [ "$chsum_resp" = "s" ]; then chsum=sha256 elif [ "$chsum_resp" = "S" ]; then chsum=sha512 fi } if [ -s "$selection" ]; then printf "work with selection (s) or current file (f) [default=f]: " read -r resp fi if [ "$resp" = "s" ]; then checksum_type sed 's|'"$PWD/"'||g' < "$selection" | xargs -0 -I{} ${chsum}sum {} > "checksum_$(date '+%Y%m%d%H%M').$chsum" # Clear selection if [ -p "$NNN_PIPE" ]; then printf "-" > "$NNN_PIPE" fi elif [ -n "$1" ]; then if [ -f "$1" ]; then for chks in md5 sha1 sha224 sha256 sha384 sha512 do if echo "$1" | grep -q \.${chks}$; then ${chks}sum -c < "$1" read -r _ exit fi done checksum_type file=$(basename "$1").$chsum ${chsum}sum "$1" > "$file" elif [ -d "$1" ]; then checksum_type file=$(basename "$1").$chsum find "$1" -type f -exec ${chsum}sum "{}" + > "$file" fi fi