foreach: définir des variables supplémentaires pour chaque fichier trouvé

This commit is contained in:
Jephté Clain 2016-07-29 11:05:39 +04:00
parent a7fd880ea4
commit de383beab1
1 changed files with 27 additions and 7 deletions

30
foreach
View File

@ -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' définie à la valeur courante de l'énumération. De plus, la variable 'index'
reçoit une valeur incrémentale commençant à 0. 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: Exemple:
$scriptname '*.c' 'cp \$item to/another/dir' $scriptname '*.c' 'cp \$item to/another/dir'
Equivalent à: Equivalent à:
@ -44,7 +51,7 @@ OPTIONS
dans le répertoire courant. dans le répertoire courant.
Si cette option est mentionnée seule, elle implique --dir Si cette option est mentionnée seule, elle implique --dir
-s, --string -s, --string
Evaluer la chaine avec le shell Evaluer l'expression avec la fonction 'eval' du shell.
-t, --title -t, --title
--no-title --no-title
Afficher (resp. ne pas afficher) chaque correspondance avant de lancer Afficher (resp. ne pas afficher) chaque correspondance avant de lancer
@ -86,19 +93,32 @@ splitfsep2 "$varexpr" = varname expr
cmd=("$@") cmd=("$@")
[ ${#cmd[*]} -gt 0 ] || cmd=('echo $item') [ ${#cmd[*]} -gt 0 ] || cmd=('echo $item')
[ -n "$basedir" ] || basedir=. if [ -n "$basedir" ]; then
case "$match" in case "$match" in
all) array_lsall items "$basedir" "$expr";; all) array_lsall items "$basedir" "$expr";;
dir) array_lsdirs items "$basedir" "$expr";; dir) array_lsdirs items "$basedir" "$expr";;
file) array_lsfiles items "$basedir" "$expr";; file) array_lsfiles items "$basedir" "$expr";;
string) eval "items=($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)" [ -n "$title" ] && einfo "${#items[@]} correspondance(s) trouvée(s)"
let index=0 let index=0
for item in "${items[@]}"; do for item in "${items[@]}"; do
[ -n "$title" ] && etitle "$item" [ -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 [ -n "$changedir" ]; then
if [ -f "$item" ]; then if [ -f "$item" ]; then
@ -109,8 +129,8 @@ for item in "${items[@]}"; do
fi fi
fi fi
if [ -n "$parentdir" ]; then if [ -n "$parentdir" ]; then
cd "$(dirname -- "$item")" cd "$dir"
item="$(basename -- "$item")" item="$name"
elif [ -n "$changedir" ]; then elif [ -n "$changedir" ]; then
cd "$item" cd "$item"
item=. item=.