From 9fe71b3e11b3fccf26d4d34f208f091817786de1 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Tue, 10 May 2016 22:23:15 +0400 Subject: [PATCH] ajouter fndate pour dater les fichiers --- fndate | 227 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100755 fndate diff --git a/fndate b/fndate new file mode 100755 index 0000000..61bc649 --- /dev/null +++ b/fndate @@ -0,0 +1,227 @@ +#!/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