From d056be4a2a9a52dbccbb2db7bee5a27da7a205c5 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Mon, 13 Jun 2016 08:18:37 +0400 Subject: [PATCH] foreach: ajouter l'option --parent --- foreach | 56 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 10 deletions(-) diff --git a/foreach b/foreach index 6044426..d9cebde 100755 --- a/foreach +++ b/foreach @@ -18,17 +18,29 @@ Exemple: OPTIONS -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. -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. + Faire la correspondance de l'expression sur les répertoires uniquement -f, --file - Faire la correspondance de l'expression sur les répertoires + Faire la correspondance de l'expression sur les fichier uniquement -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 Evaluer la chaine avec le shell -t, --title @@ -38,22 +50,32 @@ OPTIONS } basedir= -match=all +match=auto changedir= +parentdir= 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 + -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 @@ -76,7 +98,21 @@ let index=0 for item in "${items[@]}"; do [ -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[*]}" ) [ -n "$title" ] && eend "$item"