evaluate_hashbased_filename, set_hashbased_filename: переименовать файл так, чтобы в его названии фигурировал хэш

  1. #!/usr/bin/bash
  2.  
  3. # evaluate_hashbased_filename [--keep-original-filename] [--not-follow-mime] FILENAME
  4.  
  5. KEEP_ORIGINAL_FILENAME=0
  6. FOLLOW_MIME=1
  7.  
  8. hashcode_type="$0"
  9. hashcode_type="${hashcode_type##*/}"
  10. hashcode_type="${hashcode_type#*_}"
  11. hashcode_type="${hashcode_type%_*}"
  12.  
  13. eval "FILENAME=\$$#"
  14. NEW_FILENAME="${hashcode_type^^}"
  15.  
  16. set -- "${@:1:(( $# - 1 ))}"
  17.  
  18. while (( $# )); do
  19.     case "$1" in
  20.     --keep-original-filename)
  21.         if (( KEEP_ORIGINAL_FILENAME )); then
  22.             echo "You specified $1 several or more times"
  23.             exit 1
  24.         fi
  25.         KEEP_ORIGINAL_FILENAME=1
  26.         shift
  27.         ;;
  28.     --not-follow-mime)
  29.         if (( ! FOLLOW_MIME )); then
  30.             echo "You specified $1 several or more times"
  31.             exit 1
  32.         fi
  33.         FOLLOW_MIME=0
  34.         shift
  35.         ;;
  36.     *)
  37.         echo "You specified $1, the behaviour for which is not defined."
  38.         exit 1
  39.         ;;
  40.     esac
  41. done
  42.  
  43. FILE_HASHCODE="$("${hashcode_type}sum" -- "$FILENAME" | cut -f1 -d\ )"
  44. NEW_FILENAME+="_$FILE_HASHCODE"
  45.  
  46. if (( KEEP_ORIGINAL_FILENAME )); then
  47.     NEW_FILENAME+="_$FILENAME"
  48. fi
  49.  
  50. #if (( ! KEEP_ORIGINAL_FILENAME && FOLLOW_MIME )); then
  51. #   FILENAME_EXTENSION="$(recognize-filename-extension "$FILENAME")"
  52. #   if [[ ! -z "$FILENAME_EXTENSION" ]]; then
  53. #       NEW_FILENAME+=".$FILENAME_EXTENSION"
  54. #   fi
  55. #fi
  56.  
  57. printf "%s\\n" "$NEW_FILENAME"
  1. #!/usr/bin/bash
  2.  
  3. # set_hashbased_filename [MV_ARGS..] [--keep-original-filename] [--not-follow-mime] [MV_ARGS..] FILENAME
  4.  
  5. # NOTE: "internal arguments" are arguments that are used directly in evaluate_hashbased_filename and set_hashbased_filename
  6.  
  7. declare -a MV_ARGUMENTS INTEGRAL_ARGUMENTS
  8.  
  9. hashcode_type="$0"
  10. hashcode_type="${hashcode_type##*/}"
  11. hashcode_type="${hashcode_type#*_}"
  12. hashcode_type="${hashcode_type%_*}"
  13.  
  14. while (( $# - 1 )); do
  15.     case "$1" in
  16.     --keep-original-filename|--not-follow-mime)
  17.         INTERNAL_ARGUMENTS+=( "$1" )
  18.         shift
  19.         ;;
  20.     *)
  21.         MV_ARGUMENTS+=( "$1" )
  22.         shift
  23.         ;;
  24.     esac
  25. done
  26. FILENAME="$1"
  27. set -- "${INTERNAL_ARGUMENTS[@]}" "$FILENAME"
  28.  
  29. mv "${MV_ARGUMENTS[@]}" "$FILENAME" "$("evaluate_${hashcode_type}_filename" "$@")"
Синтаксис вызова показан на третьих строчках каждого скрипта

evaluate_hashbased_filename используется для генерации нового имени, а set_hashbased_filename - для задания.

Тип хэша задаётся в имени символических ссылок на эти скрипты. Должно получиться так http://ix.io/yDK для использования хэшей sha, md5 и BLAKE2 . Уже затем эти скрипты вызываются через созданные символические ссылки.

Значимый эффект достигается при использовании вместе с iterator

http://ix.io/yDL
http://ix.io/yDM

Отдельно про расширения. В Linux расширения могут быть какими попало и используются они только для повышения UX, а не для определения формата файла (хотя и для этого они всё равно могут быть использованы). Универсального правила для их определения нет.

Но можно придумать обходные решения. Как одно из них - узнавать MIME-тип файла и сравнить _предполагаемое расширение_ (последовательность символов после последней точки) с доступными для данного MIME-типа расширениями. Если совпадение есть, то выдавать _предполагаемое расширение_ за _актуальное_. Если имя файла не связано с файлом, то использовать или не использовать _предполагаемое расширение_ - как это нужно для проекта.

Вот одно из таких решений http://ix.io/yDO . Для его использования в скрипте evaluate_hashbased_filename надо раскомментировать строки с 50 по 55.

Оно не может определять "двойные расширения" и те расширения, о которых не знает (придётся вникать в упоротый способ задания двумерных массивов и самому добавлять новые возможные MIME-типы с соответствующими им новыми возможными расширениями).

  • +6
  • views 751
  • pavelshuvalov pavelshuvalov
  • comments 11

Реклама

Мы в соцсетях

tw tg yt gt