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
 |