228 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			228 lines
		
	
	
		
			7.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
 | |
| 
 | |
| function display_help() {
 | |
|     uecho "$scriptname: manipuler des noms de fichier pour les dater
 | |
| 
 | |
| USAGE
 | |
|     $scriptname (FILE|DIR)s...
 | |
|     $scriptname -k SRCs... [DESTDIR]
 | |
|     $scriptname -m SRCs... [DESTDIR]
 | |
|     $scriptname -c COMMAND [ARGs...]
 | |
| 
 | |
| OPTIONS
 | |
|     --create-or-rename
 | |
|         Créer un nouveau fichier (option -f) ou créer un nouveau répertoire
 | |
|         (option -d), ou renommer un fichier existant sans le changer de
 | |
|         répertoire. C'est l'option par défaut.
 | |
|     -f, --create-file
 | |
|         Créer un nouveau fichier. Cette option est ignorée si le fichier ou le
 | |
|         répertoire spécifié existe. C'est la valeur par défaut
 | |
|     -d, --create-dir
 | |
|         Créer un nouveau répertoire. Cette option est ignorée si le fichier ou
 | |
|         le répertoire spécifié existe.
 | |
|     -k, --copy
 | |
|         Copier le fichier SRC vers la destination DESTDIR qui vaut par défaut le
 | |
|         répertoire courant si un seul fichier source est spécifié. Si plusieurs
 | |
|         fichiers sources sont spécifiés, il faut absolument spécifier un
 | |
|         répertoire destination. Dans la destination, les fichiers sont nommés
 | |
|         avec la date en préfixe.
 | |
|     -m, --move
 | |
|         Déplacer le fichier SRC vers la destination DESTDIR qui vaut par défaut
 | |
|         le répertoire courant si un seul fichier source est spécifié. Si
 | |
|         plusieurs fichiers sources sont spécifiés, il faut absolument spécifier
 | |
|         un répertoire destination. Dans la destination, les fichiers sont nommés
 | |
|         avec la date en préfixe.
 | |
|     -c, --cmd
 | |
|         Les arguments sont une commande à lancer. Dans les argument, PLACEHOLDER
 | |
|         est remplacé par la date. Si le PLACEHOLDER n'est trouvé dans aucun des
 | |
|         arguments, alors ajouter la date à la fin de la commande. Par exemple,
 | |
|         voici comment émuler l'option -k
 | |
|             $scriptname -c cp src dest/~~
 | |
|     -P, --placeholder PLACEHOLDER
 | |
|         Dans le nom spécifié, remplacer PLACEHOLDER par la date. Par défaut,
 | |
|         PLACEHOLDER vaut ~~. Si le nom spécifié ne contient pas le PLACEHOLDER,
 | |
|         il est placé au début.
 | |
|     -F, --format FORMAT
 | |
|         Spécifier le format de la date à insérer dans le nom du fichier. Par
 | |
|         défaut, FORMAT vaut 'YYMMDD-'
 | |
|         Les formats valides sont:
 | |
|             YYYY année sur 4 chiffres
 | |
|             YY   année sur 2 chiffres
 | |
|             MM   mois sur 2 chiffres
 | |
|             DD   jour sur 2 chiffres
 | |
|         Tous les autres caractères sont pris tels-quels"
 | |
| }
 | |
| 
 | |
| function create() {
 | |
|     case "$create" in
 | |
|     file) touch "$1";;
 | |
|     dir) mkdir -p "$1";;
 | |
|     esac
 | |
| }
 | |
| function have_ph() {
 | |
|     [[ "$1" == *"$placeholder"* ]]
 | |
| }
 | |
| function replace_ph() {
 | |
|     awkrun ph="$placeholder" format="$format" autof:int="$autof" '
 | |
| BEGIN {
 | |
|   gsub(/%/, "%%", format)
 | |
|   gsub(/YYYY/, "%Y", format)
 | |
|   gsub(/YY/, "%y", format)
 | |
|   gsub(/MM/, "%m", format)
 | |
|   gsub(/DD/, "%d", format)
 | |
|   date = strftime(format)
 | |
| }
 | |
| {
 | |
|   if (index($0, "/") != 0) {
 | |
|     match($0, /\/[^/]*$/)
 | |
|     dir = substr($0, 1, RSTART)
 | |
|     name = substr($0, RSTART + 1)
 | |
|   } else {
 | |
|     dir = ""
 | |
|     name = $0
 | |
|   }
 | |
| 
 | |
|   if (autof) {
 | |
|     pos = index(name, ph)
 | |
|     if (pos == 0) {
 | |
|       print dir date "-" name
 | |
|     } else if (pos == 1) {
 | |
|       print dir date "-" substr(name, length(ph) + 1)
 | |
|     } else if (pos == length(name) - length(ph) + 1) {
 | |
|       print dir substr(name, 1, length(name) - length(ph)) "-" date
 | |
|     } else {
 | |
|       print dir substr(name, 1, pos - 1) date substr(name, pos + length(ph))
 | |
|     }
 | |
|   } else {
 | |
|     pos = index(name, ph)
 | |
|     if (pos == 0) {
 | |
|       print dir date name
 | |
|     } else {
 | |
|       print dir substr(name, 1, pos - 1) date substr(name, pos + length(ph))
 | |
|     }
 | |
|   }
 | |
| }' <<<"$1"
 | |
| }
 | |
| 
 | |
| action=create
 | |
| create=
 | |
| placeholder=
 | |
| format=
 | |
| parse_opts "${PRETTYOPTS[@]}" \
 | |
|     --help '$exit_with display_help' \
 | |
|     --create-or-rename action=create \
 | |
|     -d,--create-dir create=dir \
 | |
|     -f,--create-file create=file \
 | |
|     -k,--copy action=copy \
 | |
|     -m,--move action=move \
 | |
|     -c,--cmd action=cmd \
 | |
|     -P:,--placeholder: placeholder= \
 | |
|     -F:,--format: format= \
 | |
|     --autof autof=1 \
 | |
|     @ args -- "$@" && set -- "${args[@]}" || die "$args"
 | |
| 
 | |
| [ -n "$create" ] || create=file
 | |
| [ -n "$placeholder" ] || placeholder="~~"
 | |
| if [ -n "$format" ]; then
 | |
|     autof=
 | |
| else
 | |
|     format=YYMMDD
 | |
|     autof=1
 | |
| fi
 | |
| 
 | |
| if [ "$action" == cmd ]; then
 | |
|     # Il faut lancer une commande spécifiée
 | |
|     [ $# -gt 0 ] || set -- echo
 | |
|     args=()
 | |
|     found=
 | |
|     for arg in "$@"; do
 | |
|         if have_ph "$arg"; then
 | |
|             check_interaction -c && evalx qvals "${args[@]}" "$arg" // estepi "Commande:"
 | |
|             setx arg=replace_ph "$arg"
 | |
|             read_value "Veuillez confirmer le nom" arg "$arg"
 | |
|             found=1
 | |
|         fi
 | |
|         args=("${args[@]}" "$arg")
 | |
|     done
 | |
|     if [ -z "$found" ]; then
 | |
|         setx arg=replace_ph
 | |
|         read_value "Veuillez entrer le nom du fichier" arg "$arg"
 | |
|         args=("${args[@]}" "$arg")
 | |
|     fi
 | |
| 
 | |
|     if show_debug; then
 | |
|         evalx qvals "${args[@]}" // edebug "Commande:"
 | |
|         ask_yesno "Voulez-vous continuer?" X || die
 | |
|     fi
 | |
|     "${args[@]}"
 | |
| 
 | |
| elif [ "$action" == copy -o "$action" == move ]; then
 | |
|     if [ $# -eq 0 ]; then
 | |
|         die "Vous devez spécifier les fichiers"
 | |
|     elif [ $# -eq 1 ]; then
 | |
|         src="$1"
 | |
|         destdir=.
 | |
|         srcs=("$src")
 | |
|     else
 | |
|         args=("$@")
 | |
|         setx destdir=last_value args
 | |
|         array_copy_firsts srcs args
 | |
|     fi
 | |
|     if [ ! -d "$destdir" ]; then
 | |
|         ewarn "$destdir: répertoire introuvable"
 | |
|         ask_yesno "Voulez-vous le créer?" X || die
 | |
|         mkdir -p "$destdir" || die
 | |
|     fi
 | |
|     if [ "$action" == copy ]; then
 | |
|         cmdinfo="Copie"
 | |
|         cmd=(cp -i)
 | |
|     elif [ "$action" == move ]; then
 | |
|         cmdinfo="Déplacement"
 | |
|         cmd=(mv -i)
 | |
|     fi
 | |
|     for src in "${srcs[@]}"; do
 | |
|         setx srcname=basename -- "$src"
 | |
|         if [ -e "$src" ]; then
 | |
|             einfo "$cmdinfo de $(ppath "$src")"
 | |
|             setx destname=replace_ph "$srcname"
 | |
|             read_value "Veuillez confirmer le nom" destname "$destname"
 | |
|             "${cmd[@]}" "$src" "$destdir/$destname"
 | |
|         else
 | |
|             ewarn "$src: fichier introuvable"
 | |
|         fi
 | |
|     done
 | |
| 
 | |
| elif [ "$action" == create ]; then
 | |
|     if [ $# -gt 0 ]; then
 | |
|         for src in "$@"; do
 | |
|             setx dir=dirname -- "$src"
 | |
|             setx srcname=basename -- "$src"
 | |
|             if [ -e "$src" ]; then
 | |
|                 einfo "Renommage de $(ppath "$src")"
 | |
|                 setx destname=replace_ph "$srcname"
 | |
|                 read_value "Veuillez confirmer le nom" destname "$destname"
 | |
|                 mv -i "$src" "$dir/$destname"
 | |
|             else
 | |
|                 einfo "Création de $(ppath "$src")"
 | |
|                 setx destname=replace_ph "$srcname"
 | |
|                 read_value "Veuillez confirmer le nom" destname "$destname"
 | |
|                 create "$dir/$destname"
 | |
|             fi
 | |
|         done
 | |
|     else
 | |
|         case "$create" in
 | |
|         file) einfo "Création d'un nouveau fichier";;
 | |
|         dir) einfo "Création d'un nouveau répertoire";;
 | |
|         esac
 | |
|         setx destname=replace_ph
 | |
|         read_value "Veuillez entrer le nom" destname "$destname"
 | |
|         create "$destname"
 | |
|     fi
 | |
| 
 | |
| else
 | |
|     die "$action: action non implémentée"
 | |
| fi
 |