diff --git a/ufile b/ufile index e67764a..2b8c9d9 100755 --- a/ufile +++ b/ufile @@ -69,6 +69,10 @@ OPTIONS 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é. + -v, --var NAME=VALUE + Définir une variable qui sera utilisée par la fonction renamef. Cette + option peut être spécifiée autant de fois que nécessaire. + Les noms commençant par _ sont réservés et ne peuvent pas être définis. --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é @@ -136,12 +140,25 @@ function __set_dest() { return 0 } +function define_vars() { + local _name _value + for _name in "$@"; do + splitvar "$_name" _name _value + if [[ "$_name" == _* ]]; then + ewarn "$_name: cette variable ne peut être définie" + else + setv "$_name" "$_value" + fi + done +} + args=(% --help '$exit_with display_help' -c:,--config: config= -C,--other-configs other_configs=1 --file action=file - -j:,--nrule: nrules + -j:,--nrule: _nrules + -v:,--var: _vars --force-cp force_cp=1 -S:,--ssh: SSH= --force-scp force_scp=1 @@ -202,20 +219,20 @@ else function docmd() { "$@"; } fi -if [ ${#nrules[*]} -gt 0 ]; then - array_fix_paths nrules , - array_copy rules NRULES - nrule=1 +if [ ${#_nrules[*]} -gt 0 ]; then + array_fix_paths _nrules , + array_copy _rules NRULES + _nrule=1 else - array_copy rules RULES - nrule= + array_copy _rules RULES + _nrule= fi [ $# -gt 0 ] || die "Vous devez spécifier des fichiers à classer" -[ ${#rules[*]} -gt 0 ] || die "Il faut définir des règles ${nrule:+N}RULES 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 @@ -227,15 +244,15 @@ for rule in "${rules[@]}"; do done # faire la liste des fichiers -files=() +_files=() for file in "$@"; do if [ -d "$file" -a -n "$recursive" ]; then setx file=abspath "$file" array_from_lines rfiles "$(find "$file" -type f)" - array_extendu files rfiles + array_extendu _files rfiles elif [ -f "$file" ]; then setx file=abspath "$file" - array_addu files "$file" + array_addu _files "$file" elif [ -n "$fake" ]; then : # on est en mode fake, pas grave si le fichier n'est pas trouvé elif [ -d "$file" ]; then @@ -247,12 +264,12 @@ done # faire le classement effectif r= -for file in "${files[@]}"; do +for file in "${_files[@]}"; do setx pf=abspath "$file" 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 @@ -262,8 +279,8 @@ for file in "${files[@]}"; do odestdir="$HOME" fi - if [ -n "$nrule" ]; then - array_contains nrules "$pattern" || continue + if [ -n "$_nrule" ]; then + array_contains _nrules "$pattern" || continue else if [ "${pattern#/}" != "$pattern" ]; then awk -v filename="$filename" -v pattern="${pattern#/}" 'BEGIN { exit(filename ~ pattern? 0: 1) }' || continue @@ -275,7 +292,13 @@ for file in "${files[@]}"; do unset dest interaction=--DEFAULT-- if [ -n "$renamef" ]; then - "$renamef" "$filename" "$pf" "$odestdir" || continue + # protéger les variables nécessaires au lancement de renamef + _renamef="$renamef" + _filename="$filename" + _pf="$pf" + _odestdir="$odestdir" + define_vars "${_vars[@]}" + "$_renamef" "$_filename" "$_pf" "$_odestdir" || continue fi if is_array dest; then array_copy tmpdests dest