Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 21/10/2011, à 16:36

JujuLand

[Résolu] Récupérer et modifier une chaine

Bonjour,

je suis un peu newbee, et malgré certaines recherches, je n'arrive pas à m'en sortir.
Je veux dans un shell bash, récupérer le pwd, et mettre une partie de celle-ci dans une variable que j'utilise ensuite dans le shell,
Je pense que je dois passer par l'utilisation de awk, mais si je vois bien ce que j'ai à faire, je ne vois pas comment l'écrire
Le $PWD me retournant çà /home/alain/Images/Affiches de films/vignettes , je voudrais que ma variable $Title2 n'ai plus que ce que j'ai colorié en rouge

Voici en gros l'algorythme auquel je pense:

-position de $name dans $PWD       => 19
-décrément de la position retournée => 18
-s.ubstr chaine de $PWD                     =>  home/alain/Images/Affiches de films
-et dans une boucle (à ecrire), enlever le début jusqu'au premier / tant qu'il y a un slash 
                                                         => alain/Images/Affiches de films
                                                         => Images/Affiches de films
                                                         => Affiches de films

Voici comme je l'avais écrit, et bien sur çà foire:

name="/vignettes"
Title2=$(awk{in=index($PWD,$name);$in=$in-1;strin=s.ubstr($PWD,2,$in);print($strin)}

Si quelqu'un peut m'aider ...

PS: je n'ai pas bu, mais le serveur doit croire que 's u b s t r' est un gros-mot
Merci
A+

Dernière modification par JujuLand (Le 15/11/2011, à 12:23)


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#2 Le 21/10/2011, à 17:38

Watael

Re : [Résolu] Récupérer et modifier une chaine

salut,

utilise le remplacement de paramètres du shell

echo "$PWD"
/home/alain/Images/Affiches de films/vignettes
title2="${PWD%/*}"
title2=${title2##*/}
echo "$title2"
Affiches de films

Dernière modification par Watael (Le 21/10/2011, à 17:39)


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#3 Le 21/10/2011, à 17:41

Bousky

Re : [Résolu] Récupérer et modifier une chaine

Selon ce que tu veux exactement, les substitutions bash (google est ton amis, la commande « man bash » aussi) peuvent résoudre le problème simplement. Je vais supposer que seule la partie en rouge varie :

$ echo $PWD
/home/alain/Images/Affiches de films/vignettes
$ Title2=${PWD#/home/alain/Images/}
$ echo $Title2 
Affiches de films/vignettes
$ Title2=${Title2%/vignettes}
$ echo $Title2 
Affiches de films
$

« ${var%chaine} » et « ${var#chaine} » permettent de supprimer chaine dans la variable var si cette chaine apparait à la fin ou au début de la variable. On peut utiliser « * » ou « ? » comme jokers, auquel cas la plus petite chaine correspondante est supprimé (on peut doubler « % » ou « # » pour supprimer la plus grande chaine).

Dernière modification par Bousky (Le 21/10/2011, à 17:42)


Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)

Hors ligne

#4 Le 21/10/2011, à 17:53

JujuLand

Re : [Résolu] Récupérer et modifier une chaine

Merci, j'essaie çà

... quand à google ou man, je les ai consultés, mais je ne devais pas avoir les bonnes lunettes smile

A+


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#5 Le 21/10/2011, à 18:28

JujuLand

Re : [Résolu] Récupérer et modifier une chaine

Humm, c'est pas encore çà, car je veux que çà fonctionne n'importe où

$ Title2=${PWD#~}
$ echo $Title2
/Images/Affiches de films/vignettes
$ Title2=${Title2#/}
$ echo $Title2
Images/Affiches de films/vignettes
$ Title2=${Title2%/vignettes}
$ echo $Title2
Images/Affiches de films

Je n'arrive pas à mieux ...

A+

Dernière modification par JujuLand (Le 21/10/2011, à 18:32)


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#6 Le 21/10/2011, à 18:40

JujuLand

Re : [Résolu] Récupérer et modifier une chaine

Dans le script, çà donne çà qui fonctionne mais est incomplet, car çà affiche 'Images/Affiches de films' au lieu de 'Affiches de films'

Title3=${PWD#~}
Title3=${Title3#/}
Title3=${Title3%/vignettes}
Title3=$(echo $Title3)

Title2=$($Zenity --width $WINDOW_WIDTH --entry --title="$WINDOW_TITLE" --text "Sous-titre de la galerie d'images?" --entry-text "$Title3"); echo $Title2
    # If user aborts, zenity returns nothing, and $szAnswer will be zero length,
# and then exit.
    if [ -z "$Title2" ] ; then
 exit
fi

Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#7 Le 21/10/2011, à 20:44

aduxas

Re : [Résolu] Récupérer et modifier une chaine

Est-ce que tu veux récupérer le niveau en dessous du niveau "Images" ?  Si oui, essaye

$ Title2=${PWD#?*Images/}

comme première substitution dans #3.

Hors ligne

#8 Le 21/10/2011, à 21:26

JujuLand

Re : [Résolu] Récupérer et modifier une chaine

Oui, bien sûr, mais le répertoire pourrait être différent, et il pourrait même y avoir plusieurs niveaux.

Sachant que le répertoire vignettes pourrait être différent, mais de toute façon connu, celui-ci ne pose pas de problème, Ce qui est connu aussi, c'est le fait que le répertoire à récupérer est celui juste au dessus de vignettes.

Ce qui serait l'idéal, se serait de supprimer la partie arrière (/vignettes), et ensuite supprimer ce qui est avant le / et celui-ci. C'est pour çà que j'avais pensé à awk, mais là, je patauge.

Une solution pour éviter une boucle serait de faire un reverse de la chaine restante, et de supprimer tout ce qui est après le premier /

C'est une technique que j'avais utilisé sous windows avec des utilitaires issus de Unix, il y a bien longtemps, mais il fonctionnait avec des fichiers.

A+

Dernière modification par JujuLand (Le 21/10/2011, à 21:27)


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#9 Le 21/10/2011, à 22:13

JujuLand

Re : [Résolu] Récupérer et modifier une chaine

Sur un vieux thread, j'ai trouvé une solution qui fonctionne, mais juste pour un nombre connu (deux ici) de répertoires, pas pour un nombre indéfini:

Title3=${PWD%/vignettes}
#Title3=$[echo "$Title3"|rev}    => Ca ne fonctionne pas avec cette syntaxe
Title3=`echo "$Title3"|rev`
Title3=${Title3%/*}
Title3=${Title3%/*}                    => on voit là le problème qui reste
Title3=`echo "$Title3"|rev`
Title3=$(echo $Title3)

Il faudrait probablement insérer [Title3=${Title3%/*} dans une boucle dont on ne sortirait qu'en absence de caractère /

Mais là je ne sais pas encore faire...

A+

Dernière modification par JujuLand (Le 21/10/2011, à 22:14)


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#10 Le 21/10/2011, à 22:14

pingouinux

Re : [Résolu] Récupérer et modifier une chaine

Bonsoir,
Peut-être ceci ?

Title2=$(basename "${PWD%/vignettes}" )

Hors ligne

#11 Le 21/10/2011, à 22:18

alej

Re : [Résolu] Récupérer et modifier une chaine

Et ça...

$ pwd
/home/alex/tmp/home/alain/Images/Affiches de films/vignettes/mini/petites
$ awk -F"/" '{for(i=1;i<=NF;++i)if($i ~ /vignettes/)print $((i-1))}' <<< $PWD
Affiches de films

?

Hors ligne

#12 Le 21/10/2011, à 22:19

JujuLand

Re : [Résolu] Récupérer et modifier une chaine

Mais c'est bon dieu bien sûr ... et simplissime, en plus
smile
Merci
A+


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#13 Le 21/10/2011, à 22:25

JujuLand

Re : [Résolu] Récupérer et modifier une chaine

@alej,

pas besoin de faire compliquée (même si je retiens ta solution, car çà pourra toujours me servir), car il n'y a pas d'arboresxence en dessous vignettes

J'ai simplement francisé et fait une ou deux modifs à un script pour nautilus qui permet de génerer les vignettes des fichiers marqués, avec derrière la génération d'une page html.

Je le posterai ici, car il est sympa

Encore merci
A+


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne

#14 Le 22/10/2011, à 11:05

JujuLand

Re : [Résolu] Récupérer et modifier une chaine

Cà fonctionne nickel

Voici donc le code de la version francisée avec quelques lignes modifiées pour que ubuntu fr accepte le code

#!/bin/bash
#
# Make-Thumbnails: A simple tool to make thumbnails 
# This tool is a graphical fronted which uses Zenity and basic command
# line tools to make a folder with thumbnails in a photo folder.
# And if you want an image gallery.
# You must have imagemagik in your system.
# Author: TROiKAS troikas@pathfinder.gr
# Modified by JujuLand Alain.aupeix[at]wanadoo.fr 2011-10-21
#  - french translation
#  - preset $Title2 to path where are located files ($Title3)
#  - set $Title3 as html filename)

# To begin with, set the app title and version
TITLE="Création-de-Dossier-Vignettes"
VERSION="1.5.3"

# Set window title and window width
WINDOW_TITLE=$TITLE" (v"$VERSION")"
WINDOW_WIDTH=325
WINDOW_HEIGHT=250

# Paths to needed executables. Please adjust as necessary
Zenity=/usr/bin/zenity
Mkdir=/bin/mkdir
Cp=/bin/cp
Mogrify=/usr/bin/mogrify
Find=/usr/bin/find
Rm=/bin/rm
Killall=/usr/bin/killall
Ls=/bin/ls
Mv=/bin/mv
Expr=/usr/bin/expr
Printf=/usr/bin/printf

# Check if Zenity can be found. If not, produce error message
# (with "xmessage", since zenity is not available) and bail out
if [ ! -e "$Zenity" ]; then
xmessage "ERREUR: $Zenity non trouvé. Vous devez installer le paquet Zenity,\
ou donner un emplacement alternatif"
    exit
fi

# Check if mogrify can be found. If not, produce error message and bail out
if [ ! -e "$Mogrify" ]; then
    $ZENITY --warning --text="ERREUR: $Mogrify non trouvé.  Vous devez installer le paquet\ mogrify, ou donner un emplacement alternatif" --title="$WINDOW_TITLE"
    exit
fi 

# create a text entry dialog.
Name=$($Zenity --width $WINDOW_WIDTH --entry --title="$WINDOW_TITLE"  --text "Nom du dossier?" --entry-text "vignettes"); echo $Name

    # If user aborts, zenity returns nothing, and $szAnswer will be zero length,
    # and then exit
    if [ -z "$Name" ] ; then
exit
fi

# Make a folder with given name.
name="$Name"

$Mkdir -p $name

# Copy all photo file in the new folder.
$Find ./ -maxdepth 1 -iname '*.jpg' -exec $Cp -n {} $name \;
$Find ./ -maxdepth 1 -iname '*.JPG' -exec $Cp -n {} $name \;

$Find ./ -maxdepth 1 -iname '*.gif' -exec $Cp -n {} $name \;
$Find ./ -maxdepth 1 -iname '*.GIF' -exec $Cp -n {} $name \;

$Find ./ -maxdepth 1 -iname '*.png' -exec $Cp -n {} $name \;
$Find ./ -maxdepth 1 -iname '*.PNG' -exec $Cp -n {} $name \;

$Find ./ -maxdepth 1 -iname '*.bmp' -exec $Cp -n {} $name \;
$Find ./ -maxdepth 1 -iname '*.BMP' -exec $Cp -n {} $name \;

# Go to the new folder
cd $name

# create a text entry dialog.
Width=$($Zenity --width $WINDOW_WIDTH --entry --title="$WINDOW_TITLE" --text "Taille de vignettes?" --entry-text "150"); echo $Width

    # If user aborts, zenity returns nothing, and $szAnswer will be zero length,
# Remove all files created by the script and then exit.
    if [ -z "$Width" ] ; then
 cd ../
 $Rm -rf $name
 exit
fi

# Resize all photo files.
width="$Width"

function resize() {
for i in "$name"; do
echo "$PROGRESS";
$Find ./ -iname '*.jpg' -exec $Mogrify -resize $width *.jpg \;
$Find ./ -iname '*.JPG' -exec $Mogrify -resize $width *.JPG \;
$Find ./ -iname '*.gif' -exec $Mogrify -resize $width *.gif \;
$Find ./ -iname '*.GIF' -exec $Mogrify -resize $width *.GIF \;
$Find ./ -iname '*.png' -exec $Mogrify -resize $width *.png \;
$Find ./ -iname '*.PNG' -exec $Mogrify -resize $width *.PNG \;
$Find ./ -iname '*.bmp' -exec $Mogrify -resize $width *.bmp \;
$Find ./ -iname '*.BMP' -exec $Mogrify -resize $width *.BMP \;
done
}
# Show a progress bar.
resize | (if `$Zenity --progress --pulsate --auto-close --width $WINDOW_WIDTH --title "$WINDOW_TITLE" --text "Patience, adaptation des images en cours..."`;
                 then
# Info box when resize complete.
$Zenity --info --width $WINDOW_WIDTH --title="$WINDOW_TITLE" --text="L'adaptation de la taille est terminé."
                 else
# If user abort stop everything remove all files
# created by the script and then exit.
                     $Killall $Find
                     $Killall $Mogrify
                    cd ../
                    $Rm -rf $name
                 exit;
                 fi)

$Zenity --question --width $WINDOW_WIDTH --title="$WINDOW_TITLE" --text="Voulez-vous créer une galerie d'images?"
if [[ $? == 0 ]] ; then

Title=$($Zenity --width $WINDOW_WIDTH --entry --title="$WINDOW_TITLE" --text "Titre de la galerie d'images?" --entry-text "Mon album photo"); echo $Title
    # If user aborts, zenity returns nothing, and $szAnswer will be zero length,
# and then exit.
    if [ -z "$Title" ] ; then
 exit
fi

Title3=$(basename "${PWD%/$name}")

Title2=$($Zenity --width $WINDOW_WIDTH --entry --title="$WINDOW_TITLE" --text "Sous-titre de la galerie d'images?" --entry-text "$Title3"); echo $Title2
    # If user aborts, zenity returns nothing, and $szAnswer will be zero length,
# and then exit.
    if [ -z "$Title2" ] ; then
 exit
fi

Bgcolor=$($Zenity --width $WINDOW_WIDTH --entry --title="$WINDOW_TITLE" --text "Couleur de fond?" --entry-text "999999"); echo $Bgcolor
    # If user aborts, zenity returns nothing, and $szAnswer will be zero length,
# and then exit.
    if [ -z "$Bgcolor" ] ; then
 exit
fi

Textcolor=$($Zenity --width $WINDOW_WIDTH --entry --title="$WINDOW_TITLE" --text "Couleur du texte?" --entry-text "000000"); echo $Textcolor
    # If user aborts, zenity returns nothing, and $szAnswer will be zero length,
# and then exit.
    if [ -z "$Textcolor" ] ; then
 exit
fi

colorh=$($Zenity --width $WINDOW_WIDTH --entry --title="$WINDOW_TITLE" --text "Couleur des lignes?" --entry-text "#F30C1F"); echo $colorh
    # If user aborts, zenity returns nothing, and $szAnswer will be zero length,
# and then exit.
    if [ -z "$colorh" ] ; then
 exit
fi

widthr=$($Zenity --width $WINDOW_WIDTH --entry --title="$WINDOW_TITLE" --text "Largeur des lignes (de 1 à 100)?" --entry-text "60"); echo $widthr
    # If user aborts, zenity returns nothing, and $szAnswer will be zero length,
# and then exit.
    if [ -z "$widthr" ] ; then
 exit
fi

c=$($Zenity --width $WINDOW_WIDTH --entry --title="$WINDOW_TITLE" --text "Nombre de colonnes?" --entry-text "4"); echo $c
    # If user aborts, zenity returns nothing, and $szAnswer will be zero length,
# and then exit.
    if [ -z "$c" ] ; then
 exit
fi

# start html
echo "{!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">" >> "$Title3.html"
echo "{html><head><title>$Title</title>" >> "$Title3.html"
echo "{meta http-equiv="Content-Type" content="text/html';' charset=UTF-8">" >> "$Title3.html"
echo "{/head>" >> "$Title3.html"
echo "{body bgcolor=\"$Bgcolor\" text=\"$Textcolor\">" >> "$Title3.html"
echo "{center>" >> "$Title3.html"
echo "{h1>$Title</h1>" >> "$Title3.html"
echo "{h2>$Title2</h2>" >> "$Title3.html"
echo "{hr color="$colorh" size="2" width="$widthr%">" >>"$Title3.html"
echo "Cliquez sur la vignette pour afficher l'image en taille réelle dans un nouvel onglet." >> "$Title3.html"

TABLE_START="<table border=0 cellspacing=5 cellpadding=7 align=center>"

COUNT=0
IFS="`$Printf '\n\t'`"
        echo "$TABLE_START" >> "$Title3.html"
for i in `$Ls *.jpg *.png *.gif *.JPG *.GIF *.PNG *.bmp *.BMP`;
    do

    echo "$i"
    COUNTLOOP=`$Expr $COUNT \% $c`
    
    if [ $COUNTLOOP -eq 0 ]
    then
        echo "</tr>" >> "$Title3.html"
        echo "<tr>" >> "$Title3.html"
        echo "ok"
    fi

    COUNT=`$Expr $COUNT + 1`


            echo "<td>" >> "$Title3.html"
                echo "<a href=" >> "$Title3.html"
        echo "'"$i"' target="_blank">" >> "$Title3.html"
                echo "<img src='$name/"$i"' border="0">" >> "$Title3.html"
                echo "</a>" >> "$Title3.html"
                echo "<br>" >> "$Title3.html"
                echo "'$i'" >> "$Title3.html"
                echo "</td>" >> "$Title3.html"
            
done

echo "</tr>" >> "$Title3.html"
echo "</table>" >> "$Title3.html"
echo "<br>" >>"$Title3.html"
echo "<hr color="$colorh" size="3" width="$widthr%">" >>"$Title3.html"
echo "Créé par: Make-Thumbnails-Folder 1.5.3" >>"$Title3.html"
echo "</center>" >> "$Title3.html"
echo "</body>" >> "$Title3.html"
echo "</html>" >> "$Title3.html"

$Mv "$Title3.html" ../

# Info box image gallery complete.
$Zenity --info --width $WINDOW_WIDTH --title="$WINDOW_TITLE" --text="La galerie d'image est maintenant terminée."
else
exit
fi

exit

Voici donc les lignes à retrouver et à modifier dans le pavé de code au dessus. Remplacer 'echo "{' par 'echo"<' (en début de ligne)

# start html
echo "{!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">" >> "$Title3.html"
echo "{html><head><title>$Title</title>" >> "$Title3.html"
echo "{meta http-equiv="Content-Type" content="text/html';' charset=UTF-8">" >> "$Title3.html"
echo "{/head>" >> "$Title3.html"
echo "{body bgcolor=\"$Bgcolor\" text=\"$Textcolor\">" >> "$Title3.html"
echo "{center>" >> "$Title3.html"
echo "{h1>$Title</h1>" >> "$Title3.html"
echo "{h2>$Title2</h2>" >> "$Title3.html"
echo "{hr color="$colorh" size="2" width="$widthr%">" >>"$Title3.html"

Script à placer dans .gnome2/nautilus-scripts évidemment
A+


Xubuntu 16.04 > Dell DM061 (2007) + Dell Inspiron 531 (2008)
Xubuntu 16.04 > Asus X51L (2009) + MSI GX723 (2009)
Xubuntu 22.04 > HP 15BA048NF (2018)

Hors ligne