foreach: ajouter l'option --parent

This commit is contained in:
Jephté Clain 2016-06-13 08:18:37 +04:00
parent 63e78f44ef
commit d056be4a2a
1 changed files with 46 additions and 10 deletions

56
foreach
View File

@ -18,17 +18,29 @@ Exemple:
OPTIONS OPTIONS
-b, --basedir BASEDIR -b, --basedir BASEDIR
Chercher les expressions -d, -g, -f, -a à partir de BASEDIR au lieu du Chercher les expressions -d, -f, -a à partir de BASEDIR au lieu du
répertoire courant. répertoire courant.
-d, --dir -d, --dir
Faire la correspondance de l'expression sur les répertoires Faire la correspondance de l'expression sur les répertoires uniquement
-g, --go
Comme -d, mais pour chaque répertoire, lancer la commande après en avoir
fait le répertoire courant.
-f, --file -f, --file
Faire la correspondance de l'expression sur les répertoires Faire la correspondance de l'expression sur les fichier uniquement
-a, --all -a, --all
Faire la correspondance de l'expression sur les répertoires 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 -s, --string
Evaluer la chaine avec le shell Evaluer la chaine avec le shell
-t, --title -t, --title
@ -38,22 +50,32 @@ OPTIONS
} }
basedir= basedir=
match=all match=auto
changedir= changedir=
parentdir=
title=1 title=1
args=(+ args=(+
--help '$exit_with display_help' --help '$exit_with display_help'
-b:,--basedir: basedir= -b:,--basedir: basedir=
-d,--dir match=dir -d,--dir match=dir
-g,--go '$match=dir; changedir=1'
-f,-file match=file -f,-file match=file
-a,--all match=all -a,--all match=all
-p,--parent parentdir=1
-g,--go changedir=1
-s,--string match=string -s,--string match=string
-t,--title title=1 -t,--title title=1
--no-title title= --no-title title=
) )
parse_args "$@"; set -- "${args[@]}" parse_args "$@"; set -- "${args[@]}"
if [ "$match" == auto ]; then
if [ -n "$changedir" ]; then
match=dir
else
match=all
fi
fi
varexpr="$1"; shift varexpr="$1"; shift
splitfsep2 "$varexpr" = varname expr splitfsep2 "$varexpr" = varname expr
[ -n "$varname" ] || varname=item [ -n "$varname" ] || varname=item
@ -76,7 +98,21 @@ let index=0
for item in "${items[@]}"; do for item in "${items[@]}"; do
[ -n "$title" ] && etitle "$item" [ -n "$title" ] && etitle "$item"
( (
[ -n "$changedir" ] && cd "$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[*]}" eval "export $(echo_setv "$varname" "$item"); ${cmd[*]}"
) )
[ -n "$title" ] && eend "$item" [ -n "$title" ] && eend "$item"