#!/bin/bash # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 source "$(dirname "$0")/lib/ulib/ulib" || exit 1 urequire DEFAULTS function display_help() { uecho "$scriptname: manipuler des noms de fichier pour les dater USAGE $scriptname (FILE|DIR)s... $scriptname -k SRCs... [DESTDIR] $scriptname -m SRCs... [DESTDIR] $scriptname -c COMMAND [ARGs...] OPTIONS --create-or-rename Créer un nouveau fichier (option -f) ou créer un nouveau répertoire (option -d), ou renommer un fichier existant sans le changer de répertoire. C'est l'option par défaut. -f, --create-file Créer un nouveau fichier. Cette option est ignorée si le fichier ou le répertoire spécifié existe. C'est la valeur par défaut -d, --create-dir Créer un nouveau répertoire. Cette option est ignorée si le fichier ou le répertoire spécifié existe. -k, --copy Copier le fichier SRC vers la destination DESTDIR qui vaut par défaut le répertoire courant si un seul fichier source est spécifié. Si plusieurs fichiers sources sont spécifiés, il faut absolument spécifier un répertoire destination. Dans la destination, les fichiers sont nommés avec la date en préfixe. -m, --move Déplacer le fichier SRC vers la destination DESTDIR qui vaut par défaut le répertoire courant si un seul fichier source est spécifié. Si plusieurs fichiers sources sont spécifiés, il faut absolument spécifier un répertoire destination. Dans la destination, les fichiers sont nommés avec la date en préfixe. -c, --cmd Les arguments sont une commande à lancer. Dans les argument, PLACEHOLDER est remplacé par la date. Si le PLACEHOLDER n'est trouvé dans aucun des arguments, alors ajouter la date à la fin de la commande. Par exemple, voici comment émuler l'option -k $scriptname -c cp src dest/~~ -P, --placeholder PLACEHOLDER Dans le nom spécifié, remplacer PLACEHOLDER par la date. Par défaut, PLACEHOLDER vaut ~~. Si le nom spécifié ne contient pas le PLACEHOLDER, il est placé au début. -F, --format FORMAT Spécifier le format de la date à insérer dans le nom du fichier. Par défaut, FORMAT vaut 'YYMMDD-' Les formats valides sont: YYYY année sur 4 chiffres YY année sur 2 chiffres MM mois sur 2 chiffres DD jour sur 2 chiffres Tous les autres caractères sont pris tels-quels" } function create() { case "$create" in file) touch "$1";; dir) mkdir -p "$1";; esac } function have_ph() { [[ "$1" == *"$placeholder"* ]] } function replace_ph() { awkrun ph="$placeholder" format="$format" autof:int="$autof" ' BEGIN { gsub(/%/, "%%", format) gsub(/YYYY/, "%Y", format) gsub(/YY/, "%y", format) gsub(/MM/, "%m", format) gsub(/DD/, "%d", format) date = strftime(format) } { if (index($0, "/") != 0) { match($0, /\/[^/]*$/) dir = substr($0, 1, RSTART) name = substr($0, RSTART + 1) } else { dir = "" name = $0 } if (autof) { pos = index(name, ph) if (pos == 0) { print dir date "-" name } else if (pos == 1) { print dir date "-" substr(name, length(ph) + 1) } else if (pos == length(name) - length(ph) + 1) { print dir substr(name, 1, length(name) - length(ph)) "-" date } else { print dir substr(name, 1, pos - 1) date substr(name, pos + length(ph)) } } else { pos = index(name, ph) if (pos == 0) { print dir date name } else { print dir substr(name, 1, pos - 1) date substr(name, pos + length(ph)) } } }' <<<"$1" } action=create create= placeholder= format= parse_opts "${PRETTYOPTS[@]}" \ --help '$exit_with display_help' \ --create-or-rename action=create \ -d,--create-dir create=dir \ -f,--create-file create=file \ -k,--copy action=copy \ -m,--move action=move \ -c,--cmd action=cmd \ -P:,--placeholder: placeholder= \ -F:,--format: format= \ --autof autof=1 \ @ args -- "$@" && set -- "${args[@]}" || die "$args" [ -n "$create" ] || create=file [ -n "$placeholder" ] || placeholder="~~" if [ -n "$format" ]; then autof= else format=YYMMDD autof=1 fi if [ "$action" == cmd ]; then # Il faut lancer une commande spécifiée [ $# -gt 0 ] || set -- echo args=() found= for arg in "$@"; do if have_ph "$arg"; then check_interaction -c && evalx qvals "${args[@]}" "$arg" // estepi "Commande:" setx arg=replace_ph "$arg" read_value "Veuillez confirmer le nom" arg "$arg" found=1 fi args=("${args[@]}" "$arg") done if [ -z "$found" ]; then setx arg=replace_ph read_value "Veuillez entrer le nom du fichier" arg "$arg" args=("${args[@]}" "$arg") fi if show_debug; then evalx qvals "${args[@]}" // edebug "Commande:" ask_yesno "Voulez-vous continuer?" X || die fi "${args[@]}" elif [ "$action" == copy -o "$action" == move ]; then if [ $# -eq 0 ]; then die "Vous devez spécifier les fichiers" elif [ $# -eq 1 ]; then src="$1" destdir=. srcs=("$src") else args=("$@") setx destdir=last_value args array_copy_firsts srcs args fi if [ ! -d "$destdir" ]; then ewarn "$destdir: répertoire introuvable" ask_yesno "Voulez-vous le créer?" X || die mkdir -p "$destdir" || die fi if [ "$action" == copy ]; then cmdinfo="Copie" cmd=(cp -i) elif [ "$action" == move ]; then cmdinfo="Déplacement" cmd=(mv -i) fi for src in "${srcs[@]}"; do setx srcname=basename -- "$src" if [ -e "$src" ]; then einfo "$cmdinfo de $(ppath "$src")" setx destname=replace_ph "$srcname" read_value "Veuillez confirmer le nom" destname "$destname" "${cmd[@]}" "$src" "$destdir/$destname" else ewarn "$src: fichier introuvable" fi done elif [ "$action" == create ]; then if [ $# -gt 0 ]; then for src in "$@"; do setx dir=dirname -- "$src" setx srcname=basename -- "$src" if [ -e "$src" ]; then einfo "Renommage de $(ppath "$src")" setx destname=replace_ph "$srcname" read_value "Veuillez confirmer le nom" destname "$destname" mv -i "$src" "$dir/$destname" else einfo "Création de $(ppath "$src")" setx destname=replace_ph "$srcname" read_value "Veuillez confirmer le nom" destname "$destname" create "$dir/$destname" fi done else case "$create" in file) einfo "Création d'un nouveau fichier";; dir) einfo "Création d'un nouveau répertoire";; esac setx destname=replace_ph read_value "Veuillez entrer le nom" destname "$destname" create "$destname" fi else die "$action: action non implémentée" fi