diff --git a/foreach b/foreach index ac82d6e..066ef1f 100755 --- a/foreach +++ b/foreach @@ -13,6 +13,13 @@ 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. +En plus de VAR, les variables file, dir, name, basename, ext et dotext sont +définies. Elle valent respectivement le chemin absolu du fichier, le répertoire +absolu du fichier, le nom du fichier, le nom de base sans extension, l'extension +sans le point et l'extension avec le point, e.g pour item=dir/file.ext on a +file=/path/to/dir/file.ext, dir=/path/to/dir, name=file.ext, basename=file, +ext=ext, dotext=.ext + Exemple: $scriptname '*.c' 'cp \$item to/another/dir' Equivalent à: @@ -44,7 +51,7 @@ OPTIONS dans le répertoire courant. Si cette option est mentionnée seule, elle implique --dir -s, --string - Evaluer la chaine avec le shell + Evaluer l'expression avec la fonction 'eval' du shell. -t, --title --no-title Afficher (resp. ne pas afficher) chaque correspondance avant de lancer @@ -86,19 +93,32 @@ splitfsep2 "$varexpr" = varname expr cmd=("$@") [ ${#cmd[*]} -gt 0 ] || cmd=('echo $item') -[ -n "$basedir" ] || basedir=. - -case "$match" in +if [ -n "$basedir" ]; then + 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 + esac +else + basedir=. + case "$match" in + all) array_from_lines items "$(list_all "$basedir" "$expr")";; + dir) array_from_lines items "$(list_dirs "$basedir" "$expr")";; + file) array_from_lines items "$(list_files "$basedir" "$expr")";; + string) eval "items=($expr)";; + esac +fi [ -n "$title" ] && einfo "${#items[@]} correspondance(s) trouvée(s)" let index=0 for item in "${items[@]}"; do [ -n "$title" ] && etitle "$item" + setx file=abspath "$item" + setx dir=dirname -- "$file" + setx name=basename -- "$file" + splitname "$name" basename ext + [[ "$name" == *.* ]] && dotext=".$ext" || dotext= ( if [ -n "$changedir" ]; then if [ -f "$item" ]; then @@ -109,8 +129,8 @@ for item in "${items[@]}"; do fi fi if [ -n "$parentdir" ]; then - cd "$(dirname -- "$item")" - item="$(basename -- "$item")" + cd "$dir" + item="$name" elif [ -n "$changedir" ]; then cd "$item" item=.