85 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.3 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, -g, -f, -a à partir de BASEDIR au lieu du
 | |
|         répertoire courant.
 | |
|     -d, --dir
 | |
|         Faire la correspondance de l'expression sur les répertoires
 | |
|     -g, --go
 | |
|         Comme -d, mais pour chaque répertoire, lancer la commande après en avoir
 | |
|         fait le répertoire courant.
 | |
|     -f, --file
 | |
|         Faire la correspondance de l'expression sur les répertoires
 | |
|     -a, --all
 | |
|         Faire la correspondance de l'expression sur les répertoires
 | |
|     -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=all
 | |
| changedir=
 | |
| title=1
 | |
| args=(+
 | |
|     --help '$exit_with display_help'
 | |
|     -b:,--basedir: basedir=
 | |
|     -d,--dir match=dir
 | |
|     -g,--go '$match=dir; changedir=1'
 | |
|     -f,-file match=file
 | |
|     -a,--all match=all
 | |
|     -s,--string match=string
 | |
|     -t,--title title=1
 | |
|     --no-title title=
 | |
| )
 | |
| parse_args "$@"; set -- "${args[@]}"
 | |
| 
 | |
| 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"
 | |
|     (
 | |
|         [ -n "$changedir" ] && cd "$item"
 | |
|         eval "export $(echo_setv "$varname" "$item"); ${cmd[*]}"
 | |
|     )
 | |
|     [ -n "$title" ] && eend "$item"
 | |
|     let index=$index+1
 | |
| done
 |