228 lines
7.1 KiB
Bash
Executable File
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
|