• index.sh
    #!/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
    #!/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"
    
Edit
Pub: 14 Jul 2020 10:18 UTC
Edit: 14 Jul 2020 10:30 UTC
Views: 109