nutools/fndate

228 lines
7.1 KiB
Bash
Executable File

#!/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