ufile: support des règles nommées
This commit is contained in:
parent
2d84c44c5b
commit
191d3c223d
|
@ -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
68
ufile
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue