From a99f31301464a8f08c1d56bfe84ada99faa8c9e2 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Thu, 20 Apr 2017 23:20:18 +0400 Subject: [PATCH] ufile: classement automatique de fichiers --- lib/default/ufile | 11 +++++++ ufile | 76 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 lib/default/ufile create mode 100755 ufile diff --git a/lib/default/ufile b/lib/default/ufile new file mode 100644 index 0000000..ffce6e4 --- /dev/null +++ b/lib/default/ufile @@ -0,0 +1,11 @@ +# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 + +# règles pour le classement des fichiers. chaque règle est de la forme +# pattern:destdir[:renamef] +# 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. La fonction doit afficher le +# nouveau nom. Si le nouveau nom contient un chemin, destdir est ignoré et le +# fichier est déplacé dans le répertoire spécifié. +RULES=() diff --git a/ufile b/ufile new file mode 100755 index 0000000..b5cbb58 --- /dev/null +++ b/ufile @@ -0,0 +1,76 @@ +#!/bin/bash +# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +source "$(dirname "$0")/lib/ulib/ulib" || exit 1 +urequire DEFAULTS +set_defaults ufile + +function display_help() { + uecho "$scriptname: classer des fichiers selon certains règles + +Les règles sont dans le fichier ~/etc/default/ufile +Consulter ce fichier pour les détails + +USAGE + $scriptname [options] + +OPTIONS + -n, --fake + Afficher les opérations qui seraient faites" +} + +args=(% + --help '$exit_with display_help' + -n,--fake fake=1 +) +parse_args "$@"; set -- "${args[@]}" + +if [ -n "$fake" ]; then + function docmd() { qvals "$@"; } +else + function docmd() { "$@"; } +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 ~/default/ufile" + +for file in "$@"; do + [ -f "$file" -o -n "$fake" ] || { + eerror "$file: fichier introuvable. il sera ignoré" + continue + } + setx pf=abspath "$file" + setx dir=dirname "$pf" + setx filename=basename "$pf" + found= + for rule in "${RULES[@]}"; do + splitpair "$rule" pattern r2 + splitpair "$r2" destdir r3 + splitpair "$r3" renamef r4 + if [ "${destdir#"~/"}" != "$destdir" ]; then + destdir="$HOME/${destdir#"~/"}" + elif [ "${destdir#/}" == "$destdir" ]; then + die "règle '$rule' invalide: destdir doit être absolu" + fi + if eval "[[ \"\$filename\" == $(qwc "$pattern") ]]"; then + if [ -n "$renamef" ]; then + setx newname="$renamef" "$filename" "$pf" "$destdir" + if [[ "$newname" == */* ]]; then + splitpath "$newname" destdir destname + else + destname="$newname" + fi + else + newname="$filename" + fi + estep "$filename --> $destdir/$destname" + ask_yesno -i "Voulez-vous continuer?" O || { found=x; break; } + docmd mkdir -p "$destdir" || die "$destdir: impossible de créer le répertoire" + docmd mv -i "$file" "$destdir/$destname" || die "problème lors du déplacement du fichier" + found=1 + break + fi + done + if [ -z "$found" ]; then + ewarn "$file: aucune correspondance n'a été trouvée" + fi +done