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
 |