diff --git a/TODO.md b/TODO.md index ba43122..3e718af 100644 --- a/TODO.md +++ b/TODO.md @@ -1,9 +1,5 @@ # TODO -* ufile: ajouter l'option -r pour classer de façon récursive tous les fichiers - d'un répertoire. cette option est automatiquement activée avec une - confirmation si l'argument est un répertoire. - * ufile: chercher dans le répertoire courant (ou alors, le répertoire du fichier à classer?) un fichier .ufile.conf qui indique comment classer les fichiers. Eventuellement, chercher dans l'arborescence jusqu'au répertoire HOME de diff --git a/ufile b/ufile index 9640f61..e45641b 100755 --- a/ufile +++ b/ufile @@ -37,6 +37,7 @@ forme pattern:destdir[:renamef] USAGE $scriptname [options] + $scriptname [options] -r OPTIONS -c, --config CONFIG @@ -56,6 +57,9 @@ OPTIONS Toujours utiliser scp pour une copie distante. Par défaut s'il est déterminé que l'hôte distant est en réalité l'hôte courant, alors la copie est effectuée directement. + -r, --recursive + 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 @@ -116,6 +120,7 @@ args=(% --force-cp force_cp=1 -S:,--ssh: SSH= --force-scp force_scp=1 + -r,--recursive recursive=1 -n,--fake fake=1 -l,--list action=list -e,--edit action=edit @@ -182,13 +187,28 @@ for rule in "${RULES[@]}"; do fi done +# faire la liste des fichiers +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 + elif [ -f "$file" ]; then + setx file=abspath "$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 + eerror "$file: est un répertoire. essayez avec -r" + else + eerror "$file: fichier introuvable. il sera ignoré" + fi +done + # faire le classement effectif r= -for file in "$@"; do - [ -f "$file" -o -n "$fake" ] || { - eerror "$file: fichier introuvable. il sera ignoré" - continue - } +for file in "${files[@]}"; do setx pf=abspath "$file" setx dir=dirname -- "$pf" setx filename=basename -- "$pf"