121 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.6 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: lancer une commande pour un ensemble d'arguments
 | |
| 
 | |
| USAGE
 | |
|     $scriptname [options] [VAR=]expr cmd...
 | |
| 
 | |
| La commande est lancée avec la variable 'VAR', qui vaut par défaut 'item',
 | |
| définie à la valeur courante de l'énumération. De plus, la variable 'index'
 | |
| reçoit une valeur incrémentale commençant à 0.
 | |
| 
 | |
| Exemple:
 | |
|     $scriptname '*.c' 'cp $item to/another/dir'
 | |
| 
 | |
| OPTIONS
 | |
|     -b, --basedir BASEDIR
 | |
|         Chercher les expressions -d, -f, -a à partir de BASEDIR au lieu du
 | |
|         répertoire courant.
 | |
|     -d, --dir
 | |
|         Faire la correspondance de l'expression sur les répertoires uniquement
 | |
|     -f, --file
 | |
|         Faire la correspondance de l'expression sur les fichier uniquement
 | |
|     -a, --all
 | |
|         Faire la correspondance de l'expression sur les répertoires et les
 | |
|         fichiers
 | |
|     -p, --parent
 | |
|         Pour chaque fichier/répertoire, se placer dans le répertoire parent
 | |
|         avant de lancer la commande. item est aussi modifié pour ne plus
 | |
|         contenir que le nom de la cible (qui est désormais dans le répertoire
 | |
|         courant)
 | |
|         Cette option a la priorité sur --go
 | |
|     -g, --go
 | |
|         Si la cible est un répertoire, en faire le répertoire courant avant de
 | |
|         lancer la commande. Si la cible est un fichier, faire comme --parent et
 | |
|         se placer dans le répertoire du fichier avant de lancer la commande.
 | |
|         Dans les deux cas, item est modifié pour ne plus contenir que le nom de
 | |
|         la cible, soit '.' pour le répertoire courant, soit le nom du fichier
 | |
|         dans le répertoire courant.
 | |
|         Si cette option est mentionnée seule, elle implique --dir
 | |
|     -s, --string
 | |
|         Evaluer la chaine avec le shell
 | |
|     -t, --title
 | |
|     --no-title
 | |
|         Afficher (resp. ne pas afficher) chaque correspondance avant de lancer
 | |
|         la commande. Par défaut, l'affichage est effectué."
 | |
| }
 | |
| 
 | |
| basedir=
 | |
| match=auto
 | |
| changedir=
 | |
| parentdir=
 | |
| title=1
 | |
| args=(+
 | |
|     --help '$exit_with display_help'
 | |
|     -b:,--basedir: basedir=
 | |
|     -d,--dir match=dir
 | |
|     -f,-file match=file
 | |
|     -a,--all match=all
 | |
|     -p,--parent parentdir=1
 | |
|     -g,--go changedir=1
 | |
|     -s,--string match=string
 | |
|     -t,--title title=1
 | |
|     --no-title title=
 | |
| )
 | |
| parse_args "$@"; set -- "${args[@]}"
 | |
| 
 | |
| if [ "$match" == auto ]; then
 | |
|     if [ -n "$changedir" ]; then
 | |
|         match=dir
 | |
|     else
 | |
|         match=all
 | |
|     fi
 | |
| fi
 | |
| 
 | |
| varexpr="$1"; shift
 | |
| splitfsep2 "$varexpr" = varname expr
 | |
| [ -n "$varname" ] || varname=item
 | |
| [ -n "$expr" ] || expr="*"
 | |
| 
 | |
| cmd=("$@")
 | |
| [ ${#cmd[*]} -gt 0 ] || cmd=('echo $item')
 | |
| 
 | |
| [ -n "$basedir" ] || basedir=.
 | |
| 
 | |
| case "$match" in
 | |
|     all) array_lsall items "$basedir" "$expr";;
 | |
|     dir) array_lsdirs items "$basedir" "$expr";;
 | |
|     file) array_lsfiles items "$basedir" "$expr";;
 | |
|     string) eval "items=($expr)";;
 | |
| esac
 | |
| 
 | |
| [ -n "$title" ] && einfo "${#items[@]} correspondance(s) trouvée(s)"
 | |
| let index=0
 | |
| for item in "${items[@]}"; do
 | |
|     [ -n "$title" ] && etitle "$item"
 | |
|     (
 | |
|         if [ -n "$changedir" ]; then
 | |
|             if [ -f "$item" ]; then
 | |
|                 parentdir=1
 | |
|             elif [ ! -d "$item" ]; then
 | |
|                 ewarn "$item: n'est pas un répertoire"
 | |
|                 changedir=
 | |
|             fi
 | |
|         fi
 | |
|         if [ -n "$parentdir" ]; then
 | |
|             cd "$(dirname -- "$item")"
 | |
|             item="$(basename -- "$item")"
 | |
|         elif [ -n "$changedir" ]; then
 | |
|             cd "$item"
 | |
|             item=.
 | |
|         fi
 | |
|         eval "export $(echo_setv "$varname" "$item"); ${cmd[*]}"
 | |
|     )
 | |
|     [ -n "$title" ] && eend "$item"
 | |
|     let index=$index+1
 | |
| done
 |