index.sh ⎗ ✓ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35#!/bin/bash # USAGE /path/to/index.sh [-m -l] path/to/dir or path/to/file(s) ( cd "$(dirname "$0")" mkdir -p data index ) move=1 link=1 while getopts "ml" arg; do case $arg in m) move=0 ;; l) link=0 ;; esac done shift $(($OPTIND - 1)) while [ "${#@}" -gt 0 ]; do [ -e "$1" ] || { echo "miss $1"; exit 1; } [ -L "$1" ] && { shift; continue; } target="$(realpath "$1")" ( export move link cd "$(dirname "$0")" find "$target" \( -name '*.list' -o -name last -o -name '*.sh' \) -prune -o -type f -print0 | xargs -0 -n1 -I{} ./process.sh {} ) || exit 1 shift done process.sh ⎗ ✓ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32#!/bin/bash move=${move:-1} link=${link:-1} hash_sha1="$(cat "$1" | sha1sum | awk '{print $1}')" hash_md5="$(cat "$1" | md5sum | awk '{print $1}')" hash_sha256="$(cat "$1" | sha256sum | awk '{print $1}')" size="$(cat "$1" | wc -c | awk '{print $1}')" ext="$(echo "$1" | grep -Po '.\.\K[_a-zA-Z0-9]*(|\.gz)$' | tr '[:upper:]' '[:lower:]' | sed 's/jpeg/jpg/g' | sed 's/^./.&/g')" path="data$(echo "$hash_sha1" | sed 's|....|/&|g')$ext" mkdir -p "$(dirname "$path")" if [ "$move" -eq 1 ]; then mv "$1" "$PWD/$path" [ "$link" -eq 1 ] && ln -s "$path" "$1" else cp "$1" "$PWD/$path" fi index="index/$(echo "$hash_sha1" | sed 's/^\(....\).*/\1/g')" touch "$index" data="$hash_md5 $hash_sha1 $hash_sha256 $path $size" grep -q "$hash_sha1" "$index" || echo "$data" >> "$index" echo "$data"