evaluate_hashbased_filename, set_hashbased_filename: переименовать файл так, чтобы в его названии фигурировал хэш
- #!/usr/bin/bash
- # evaluate_hashbased_filename [--keep-original-filename] [--not-follow-mime] FILENAME
- KEEP_ORIGINAL_FILENAME=0
- FOLLOW_MIME=1
- hashcode_type="$0"
- hashcode_type="${hashcode_type##*/}"
- hashcode_type="${hashcode_type#*_}"
- hashcode_type="${hashcode_type%_*}"
- eval "FILENAME=\$$#"
- NEW_FILENAME="${hashcode_type^^}"
- set -- "${@:1:(( $# - 1 ))}"
- while (( $# )); do
- case "$1" in
- --keep-original-filename)
- if (( KEEP_ORIGINAL_FILENAME )); then
- echo "You specified $1 several or more times"
- exit 1
- fi
- KEEP_ORIGINAL_FILENAME=1
- shift
- ;;
- --not-follow-mime)
- if (( ! FOLLOW_MIME )); then
- echo "You specified $1 several or more times"
- exit 1
- fi
- FOLLOW_MIME=0
- shift
- ;;
- *)
- echo "You specified $1, the behaviour for which is not defined."
- exit 1
- ;;
- esac
- done
- FILE_HASHCODE="$("${hashcode_type}sum" -- "$FILENAME" | cut -f1 -d\ )"
- NEW_FILENAME+="_$FILE_HASHCODE"
- if (( KEEP_ORIGINAL_FILENAME )); then
- NEW_FILENAME+="_$FILENAME"
- fi
- #if (( ! KEEP_ORIGINAL_FILENAME && FOLLOW_MIME )); then
- # FILENAME_EXTENSION="$(recognize-filename-extension "$FILENAME")"
- # if [[ ! -z "$FILENAME_EXTENSION" ]]; then
- # NEW_FILENAME+=".$FILENAME_EXTENSION"
- # fi
- #fi
- printf "%s\\n" "$NEW_FILENAME"
- #!/usr/bin/bash
- # set_hashbased_filename [MV_ARGS..] [--keep-original-filename] [--not-follow-mime] [MV_ARGS..] FILENAME
- # NOTE: "internal arguments" are arguments that are used directly in evaluate_hashbased_filename and set_hashbased_filename
- declare -a MV_ARGUMENTS INTEGRAL_ARGUMENTS
- hashcode_type="$0"
- hashcode_type="${hashcode_type##*/}"
- hashcode_type="${hashcode_type#*_}"
- hashcode_type="${hashcode_type%_*}"
- while (( $# - 1 )); do
- case "$1" in
- --keep-original-filename|--not-follow-mime)
- INTERNAL_ARGUMENTS+=( "$1" )
- shift
- ;;
- *)
- MV_ARGUMENTS+=( "$1" )
- shift
- ;;
- esac
- done
- FILENAME="$1"
- set -- "${INTERNAL_ARGUMENTS[@]}" "$FILENAME"
- 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-типы с соответствующими им новыми возможными расширениями).
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-типы с соответствующими им новыми возможными расширениями).