ufile: support des règles nommées

This commit is contained in:
Jephté Clain 2017-12-27 07:44:51 +04:00
parent 2d84c44c5b
commit 191d3c223d
2 changed files with 52 additions and 19 deletions

View File

@ -3,3 +3,6 @@
# Règles pour le classement des fichiers. Chaque règle est de la forme
# pattern:destdir[:renamef]
RULES=()
# Règles nommées. Chaque règle est de la forme name:destdir[:renamef]
NRULES=()

68
ufile
View File

@ -8,17 +8,22 @@ function display_help() {
Les règles sont spécifiées dans le fichier ~/etc/default/ufile
Dans ce fichier, le tableau RULES contient des règles qui sont chacune de la
forme pattern:destdir[:renamef]
Dans ce fichier, deux tableaux contiennent les règles applicables:
* le tableau RULES contient des règles de la forme pattern:destdir[:renamef] et
permet de classer des fichiers correspondant à des patterns
* le tableau NRULES contient des règles de fle forme name:destdir[:renamef] et
permet de classer des fichiers quelconques en spécifiant la règle à utiliser
- pattern est au format glob et identifie les fichiers auxquels s'applique la
Les champs sont:
* name est un nom quelconque, utilisé avec l'option --name
* pattern est au format glob et identifie les fichiers auxquels s'applique la
règle, sauf si la chaine commence par / auquel cas il s'agit d'une expression
régulière reconnue par awk. Par exemple, les deux patterns suivants sont
équivalents:
[ab]cd*.pdf
/[ab]cd.*\\\\.pdf\$
- destdir est le répertoire de destination dans lequel classer le fichier
- renamef est une fonction qui permet de supporter le renommage d'un fichier
* destdir est le répertoire de destination dans lequel classer le fichier
* renamef est une fonction qui permet de supporter le renommage d'un fichier
lors de son classement. Sa signature est 'renamef filename pf destdir' où
filename est le nom du fichier source, pf son chemin complet et destdir la
valeur de destdir mentionnée dans la règle.
@ -43,6 +48,14 @@ USAGE
$scriptname [options] <files...>
$scriptname [options] -r <files|dirs...>
ACTIONS
--file
Classer les fichiers spécifiés. C'est l'action par défaut
-l, --list
Lister les règles définies
-e, --edit
Lancer un éditeur sur le fichier de configuration
OPTIONS
-c, --config CONFIG
Utiliser le fichier de configuration spécifié au lieu de la valeur par
@ -50,8 +63,12 @@ OPTIONS
-C, --other-configs
Charger les fichiers ~/etc/ufile.d/*.conf en plus du fichier spécifié
avec --config. Cette option est ignorée si --config n'est pas utilisé.
--file
Classer les fichiers spécifiés. C'est l'action par défaut
-j, --nrule NAME
Spécifier une règle du tableau NRULES à utiliser pour classer les
fichiers spécifiés. Cette option peut être spécifiée autant de fois que
nécessaire.
Par défaut, seul le tableau RULES est utilisé pour trouver la règle à
appliquer. Avec cette option, seul le tableau NRULES est utilisé.
--force-cp
Spécifier le mode de classement des fichiers. Par défaut, le fichier est
déplacé dans la destination s'il s'agit d'un classement local, ou copié
@ -71,11 +88,7 @@ OPTIONS
Classer récursivement tous les fichiers d'un répertoire. Sans cette
option, il n'est pas autorisé de fournir un répertoire comme argument.
-n, --fake
Afficher les opérations qui seraient faites
-l, --list
Lister les règles définies
-e, --edit
Lancer un éditeur sur le fichier de configuration"
Afficher les opérations qui seraient faites"
}
function joinp() {
@ -128,6 +141,7 @@ args=(%
-c:,--config: config=
-C,--other-configs other_configs=1
--file action=file
-j:,--nrule: nrules
--force-cp force_cp=1
-S:,--ssh: SSH=
--force-scp force_scp=1
@ -143,7 +157,7 @@ parse_args "$@"; set -- "${args[@]}"
## charger toutes les règles
conf_init -a RULES
conf_init -a RULES NRULES
if [ -n "$config" ]; then
if [ "$action" != edit ]; then
# le fichier doit exister, sauf en mode édition où il sera créé s'il
@ -162,7 +176,10 @@ fi
## actions particulières
if [ "$action" == list ]; then
echo "# RULES"
array_to_lines RULES
echo "# NRULES"
array_to_lines NRULES
exit 0
elif [ "$action" == edit ]; then
[ -n "$config" ] || setx config=get_user_defaults_file ufile
@ -185,11 +202,20 @@ else
function docmd() { "$@"; }
fi
if [ ${#nrules[*]} -gt 0 ]; then
array_fix_paths nrules ,
array_copy rules NRULES
nrule=1
else
array_copy rules RULES
nrule=
fi
[ $# -gt 0 ] || die "Vous devez spécifier des fichiers à classer"
[ ${#RULES[*]} -gt 0 ] || die "Vous devez spécifier des règles pour le classement des fichiers dans ~/etc/default/ufile ou ~/etc/ufile.d/*.conf"
[ ${#rules[*]} -gt 0 ] || die "Il faut définir des règles ${nrule:+N}RULES dans ~/etc/default/ufile ou ~/etc/ufile.d/*.conf"
# vérifier les règles
for rule in "${RULES[@]}"; do
for rule in "${rules[@]}"; do
splitpair "$rule" pattern r2
splitpair "$r2" destdir r3
splitpair "$r3" renamef r4
@ -226,7 +252,7 @@ for file in "${files[@]}"; do
setx dir=dirname -- "$pf"
setx filename=basename -- "$pf"
found=
for rule in "${RULES[@]}"; do
for rule in "${rules[@]}"; do
splitpair "$rule" pattern r2
splitpair "$r2" odestdir r3
splitpair "$r3" renamef r4
@ -236,10 +262,14 @@ for file in "${files[@]}"; do
odestdir="$HOME"
fi
if [ "${pattern#/}" != "$pattern" ]; then
awk -v filename="$filename" -v pattern="${pattern#/}" 'BEGIN { exit(filename ~ pattern? 0: 1) }' || continue
if [ -n "$nrule" ]; then
array_contains nrules "$pattern" || continue
else
eval "[[ \"\$filename\" == $(qwc "$pattern") ]]" || continue
if [ "${pattern#/}" != "$pattern" ]; then
awk -v filename="$filename" -v pattern="${pattern#/}" 'BEGIN { exit(filename ~ pattern? 0: 1) }' || continue
else
eval "[[ \"\$filename\" == $(qwc "$pattern") ]]" || continue
fi
fi
unset dest