105 lines
3.1 KiB
Bash
Executable File
105 lines
3.1 KiB
Bash
Executable File
#!/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] <files...>
|
|
|
|
OPTIONS
|
|
-n, --fake
|
|
Afficher les opérations qui seraient faites
|
|
-l, --list
|
|
Lister les règles définies
|
|
-e, --edit
|
|
Lancer un éditeur pour mettre à jour les règles"
|
|
}
|
|
|
|
args=(%
|
|
--help '$exit_with display_help'
|
|
-n,--fake fake=1
|
|
-l,--list action=list
|
|
-e,--edit action=edit
|
|
--file action=file
|
|
)
|
|
parse_args "$@"; set -- "${args[@]}"
|
|
|
|
[ -n "$action" ] || action=file
|
|
|
|
if [ "$action" == list ]; then
|
|
array_to_lines RULES
|
|
exit 0
|
|
elif [ "$action" == edit ]; then
|
|
setx ufile=get_user_defaults_file ufile
|
|
if [ ! -f "$ufile" ]; then
|
|
einfo "Le fichier $(ppath "$ufile") n'existe pas. Il sera créé avec un contenu par défaut"
|
|
mkdirof "$ufile" || die
|
|
cp "$scriptdir/lib/defaults/ufile" "$ufile"
|
|
fi
|
|
"${EDITOR:-vi}" "$ufile"
|
|
exit $?
|
|
fi
|
|
|
|
[ "$action" == file ] || die "bug: $action: action non implémentée"
|
|
|
|
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
|
|
newname=
|
|
"$renamef" "$filename" "$pf" "$destdir"
|
|
if [ -z "$newname" ]; then
|
|
destname="$filename"
|
|
elif [[ "$newname" == */* ]]; then
|
|
splitpath "$newname" destdir destname
|
|
else
|
|
destname="$newname"
|
|
fi
|
|
else
|
|
destname="$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
|