diff --git a/lib/default/ufile b/lib/default/ufile index 755d24a..e3f3b4a 100644 --- a/lib/default/ufile +++ b/lib/default/ufile @@ -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=() diff --git a/ufile b/ufile index 0146819..e67764a 100755 --- a/ufile +++ b/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] $scriptname [options] -r +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