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 12/10/2010, à 15:46

Alextazy

Scripts pour remplacer un supercopier...

Bonjour la communauté!

Depuis longtemps, je suis frustré sous ubuntu (et linux plus généralement) de ne pas avoir un vrai équivalent à Supercopier qui existe sous M$ Windows. J'ai bien essayé les ultra-copier et autre minicopier mais... bof, et je pense pas être le seul.

Je me suis alors lancé dans l'écriture d'un script qui générerais une liste de copie, rajoutant des fichiers à cette liste à chaque fois qu'on solliciterait ce script,  et un autre qui copierai cette liste à l'endroit voulu à l'aide de rsync, et effaçant la précédente liste.

Juste une précision importante: je n'ai presque jamais rien coder de ma vie... donc pardonnez le crado du code que j'expose ici, ainsi que pour l'éventuel vocabulaire approximatif que j'emploierais... mais faut bien commencer quelque part!!

J'ai l'impression d'en être vraiment pas loin, à un "habillage avec zenity" près...

#!/bin/bash
echo $NAUTILUS_SCRIPT_SELECTED_URIS| sed -e 's/file:\/\///g' -e 's/\%20/\\ /g' | sed -s 's/\ \//\n\//g'> /tmp/liste_de_copie-tmp 

#### sélectionne ce qu'il y a "sous le clic", le met sous la forme d'une liste,  avec sur chaque ligne un chemin complet de fichiers que l'on veut rajouter à la liste

### les "files:" sont remplacés par un retour charriot, les "%20" par des 'backslash espace'

### place cette liste dans un fichier temporaire

cat /tmp/liste_de_copie-tmp /tmp/liste_de_copie-tmp2 > /tmp/liste_de_copie 
### concatène cette liste avec une précédente liste de fichiers sélectionnés

cp /tmp/liste_de_copie /tmp/liste_de_copie-tmp2 
### crée un fichier temporaire pour la concaténation précédente

ça me fais une "belle" liste, à donner à manger à rsync pour qu'il la copie dans le dossier voulu ("sous le clic" également! smile

#!/bin/bash
if [ "$1" = "" ];then
    wdir=${NAUTILUS_SCRIPT_CURRENT_URI#file://}
    wdir=${wdir//%20/ }
else
    filetype=$(file "$1")
    filetype=${filetype##*: }

    if [ "$filetype" = "directory" ];then
        wdir=${NAUTILUS_SCRIPT_SELECTED_FILE_PATHS%%$1*}
        wdir=$wdir/$1
    else
        wdir=${NAUTILUS_SCRIPT_SELECTED_FILE_PATHS%%$1*}
    fi
fi

rsync -Hauv --progress --no-relative -r --files-from="/tmp/liste_de_copie" / $wdir/
rm -rf /tmp/liste_de_copie*

Tout est parfait dans le meilleurs de monde... Sauf que malheureusement, chaque caractère"spécial" du style " é " est retranscrit par " %C3%A9 " par exemple... ce qui est sous le clique ne possède pas le bon codage apparement sad. Je suis sûr que c'est un détail insignifiant, mais je ne sais vraiment pas comment faire sans avoir à faire un "sed" pour chaque caractère dans ce genre... ce qui représente un travail énorme pour moi hmm... quelqu'un a une idée?

Hors ligne

#2 Le 12/10/2010, à 17:22

AnsuzPeorth

Re : Scripts pour remplacer un supercopier...

Bjr,
Je ne connais pas rsync, minicopier & co.
Mais rsync ne supporte pas les chemins 'protégés'  ? (ceux provenant de nautilus,, copiés dans un fichier)
Sinon, pour remplacer les %20 & co:

echo -e "${var//\%/\\x}"

Autre chose, pourquoi faire une valse entre les fichiers tmp ? Ecrire à la suite du même fichier ne ferait pas l'affaire ?


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#3 Le 12/10/2010, à 18:05

Alextazy

Re : Scripts pour remplacer un supercopier...

Merci AnsuzPeorth de t'intéresser à mon cas.

Rsync veut une liste de chemin du style:

/chemin/du/fichier1\ avec\ espace
/chemin/du/fichier2\ avec\ un\ é
....

Je dois être un peu gogol mais je ne sais pas trop où ni  comment insérer ton code dans mon script... je rappelle  que je suis très débutant big_smile .

Pour les "temp", oké, c'est pas ce qu'il y a plus simple, mais c'est comme ça que m'en sort le mieux ... et ça marche smile.

Hors ligne

#4 Le 12/10/2010, à 18:38

AnsuzPeorth

Re : Scripts pour remplacer un supercopier...

Pour les "temp", oké, c'est pas ce qu'il y a plus simple, mais c'est comme ça que m'en sort le mieux ... et ça marche

Je comprends pourquoi passer par des tmp.
Tu récup le fichier de nautilus, tu le copie dans un tmp, ensuite de rassemble tmp et tmp1 > tmp2 et apres tmp2 > tmp1 ....
Simplement:

echo ... >> /tmp/liste-de-copie
#au lieu de
echo ... > /tmp/liste-de-copie
...
...

Dans liste-de-copie tu auras tous les fichiers nautilus que tu auras passer par ton script. Ensuite ton rsync pour supprimer ce fichier.

Je dois être un peu gogol mais je ne sais pas trop où ni  comment insérer ton code dans mon script... je rappelle  que je suis très débutant

A savoir, lors de l'utilisation de nautilus via ses script, les chemins sont tjrs fini par \r\n, donc si on les mets dans une variable, la dernièere ligne est vide. Il faut donc la supprimer si on veut traiter plusieurs fichiers (sélection multiple dans nautilus) avec sed ou tail ou ....
Pour utilser la commande:

chemin='/chemin/avec%20des%20trous%20partout'
chemin=$(echo -e "${chemin//\%/\\x}")

Dernière modification par AnsuzPeorth (Le 12/10/2010, à 18:39)


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#5 Le 13/10/2010, à 11:15

Alextazy

Re : Scripts pour remplacer un supercopier...

Merci 1000x AnsuzPeorth!!! smile big_smile smile big_smile cool

Mes scripts fonctionnent grâce à toi!!! À moi les copies multiples à la suite et pas en parallèle! La dernière ligne vide ne me pose aucun problème apparemment.... et je me suis trompé au sujet de rsync, il accèpte bien les espaces dans les noms!

Je posterais ici mes scripts dès qu'ils seront un peu plus "propres"... et peut-être ailleurs pour que ça aide d'autres, mais je ne sais pas encore trop où...

Dernière modification par Alextazy (Le 19/10/2010, à 09:54)

Hors ligne

#6 Le 19/10/2010, à 13:08

Alextazy

Re : Scripts pour remplacer un supercopier...

Voilà enfin les "bêtes". Je n'en poste que 3 pour des questions de lisibilité; l'ensemble de la gamme est disponible ici en .7z et là en .tar.gz.

Je suis assez content de leur fonctionnement plutôt propre (et oui, ils fonctionnent!!), et pourraient à mon avis intéresser du monde (sondage autour de moi sur 7 personnes unanimes!). Je rappelle que se sont des scripts nautilus, destinés au Toutefois, il reste quelques petits détails à régler, et c'est là que je sillicite votre aide bienveillante wink smile.

J'ai noter quelques mots sur le fonctionnement de chaque script, mais bon, le mieux c'est d'essayer les scripts.

Here we go.


Voici celui qui génère le panier de copie:

Il vérifie s'il existe un panier de copie si oui, il rajoute les fichiers sélectionner juste à la suite. Si non, il en crée un et crée une notification. Si l'on clique sur cette notification, cela ouvre une fenêtre avec la liste (éditable) contenue dans le panier de copie. Cette étape est très utile si l'on veut supprimer totalement la liste sans avoir à faire un clique droit dans nautilus. Si l'on clique sur fermer, la liste éditée remplace l'ancienne; si l'on ferme la fenêtre, cela revient à annuler. Dans tous les cas si la liste n'est pas supprimée (auquel cas ça ferme le programme), cela retourne à la notification.   

#!/bin/bash

### sélectionne ce qu'il y a "sous le clic" ### met sous la forme d'une liste, 
### avec sur chaque ligne un chemin complet de fichiers que l'on veut rajouter à la liste
### les "files:" sont remplacés par un retour charriot, les "%20" par des 'backslash espace'
chemin=$(echo -e "${NAUTILUS_SCRIPT_SELECTED_URIS//\%/\\x}");
chemin=$(echo $chemin | sed -e 's/file:\/\///g');

### réupère le nom du script, cherche tous les PIDs des scripts ayant ce nom et stocke tout ceci dans un fichier
nom_du_script=$(echo ${0##*/})
pidof -x $nom_du_script | sed 's#'$$'##g'>> /tmp/panier_de_copie_lock

### Test pour savoir si le panier de copie existe et est non nul
if test -s /tmp/panier_de_copie; 
then 
    ### si le panier de copie existe et est non nul, la liste des fichiers/dossiers à mettre dans le panier de copie est stockée (à la suite) dans un fichier puis termine le script
    echo $chemin  | sed -s 's/\ \//\n\//g' >> /tmp/panier_de_copie;
    break
else
    ### Si le panier n'existe pas encore ou bien est vide, la liste des fichiers/dossiers à mettre dans le panier de copie est stockée (à la suite) dans un fichier...
    echo $chemin  | sed -s 's/\ \//\n\//g' >> /tmp/panier_de_copie;
    ### ... et tant que celui-ci existe et est non vide...
    while test -s /tmp/panier_de_copie
        do 
        ###... affiche une notification
        zenity --notification\
          --window-icon="info" \
          --text="Panier copie en cours";

        ### Si on clique sur cette notification, il s'affiche une fenêtre contenant le panier de copie que l'on peut éventuellement éditer
        zenity --text-info \
        --title="panier éditable" \
        --width=1000 \
        --height=500 \
        --filename=/tmp/panier_de_copie \
        --editable > /tmp/panier_de_copie_tmp
        ### Si l'utilisateur a cliqué sur "fermer" (pas fermer la fenêtre sur la croix de sortie qui équivaut à annuler)...
        if [ $? == 0 ]; 
        then
            ### Si le panier que l'on a éditer existe et est non vide...
             if test -s /tmp/panier_de_copie_tmp; 
            then
                ### ...on copie ce panier édité à la place du panier de copie, puis on supprime le panier édité
                cat /tmp/panier_de_copie_tmp > /tmp/panier_de_copie
                rm /tmp/panier_de_copie_tmp*
            else 
                ### ...sinon, on supprime le panier de copie et le panier édité; cette première suppression entraine la sortie de la boucle, sinon, après chaque "édition" ou fermeture de la fenêtre d'édition, la notification réaparait, et on peu re-cliquer dessus pour l'édition du panier...
                rm -rf /tmp/panier_de_copie*
            fi
        fi
    done
fi
### À la fin du script, on supprime le fichier contenant le(s) PID des scripts qui portent le nom de celui-ci
rm -rf /tmp/panier_de_copie_lock
done

Dans ce sript, tout se passe à merveille, mais il indique tout de même une erreur de syntaxe que je ne comprends pas ligne 54: Syntax error: "done" unexpected ... tout a l'air à sa bonne place pourtant, je l'air tourné dans tous les sens sans succès.



--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



Voilà le script qui colle les fichiers à l'endroit sélectionné.

Il ouvre rsync qui effectue le transfert dans une fenêtre gnome-terminal qui se ferme une fois terminé. Il demande aussi si le panier de copie doit être conservé. Si la réponse est non, cela supprime (évidement!) le panier et tue le script qui a généré la liste; malheureusement cette étape ne fonctionne pas totalement. Le script est bien tué, mais zenity qui est apparemment un processus fils reste ouvert. sad Cela a pour conséquence de laisser l'icone de notification alors qu'il n'y a plus de panier... ça fait moins propre.

#!/bin/bash

### copie le panier de copie précédement crée à l'endroit du clic si le panier de copie existe et est non vide
if test -s /tmp/panier_de_copie; 
then 
    gnome-terminal --title="progression de la copie par rsync" -e 'rsync -Hau -h --progress --no-relative -r --files-from="/tmp/panier_de_copie" / .'

### boite de dialogue qui demande si la panier doit être conservée pour utilisation ultérieure ("annuler" ou fermer la fenêtre) ou l'efface si la réponse est "OK"
    zenity --question \
    --text="Voulez-vous conserver la panier de copie?"
    if [ $? -eq 1 ]; then
        rm -rf /tmp/panier_de_copie
        kill -9 $(cat /tmp/panier_de_copie_lock)
        rm - rf /tmp/.lock_panier_de_copie
    fi
else
    zenity --error \
  --text="Il n'y a <b>pas de panier de copie</b> à modifier ou bien il est <b>vide</b>. 

                                 <big><b>☹</b></big> Désolé. <big><b>☹</b></big>"
fi
done

J'ai aussi fais un autre script un autre qui déplace tous les fichiers de la liste à l'endroit sélectionné; comme le "coller" du couper/coller". Il demande confirmation lors du déplacement pour éviter des fausses manipulations.



--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



Voilà un script qui permet d'éditer de différentes manières le panier

À l'aide d'une liste à choix zenity, il permet de choisir d'éditer le panier soit en enlevant quelques entrées, soit en gardant que quelque unes, soit en supprimant simplement le panier. Il enregistre le panier édité à la place de l'ancien.

#!/bin/bash

### Définition des variables qui correspondent aux différents choix possible
rep1="Retirer quelques entrées  ()"
rep2="Ne garder que quelques entrées  () "
rep3="Supprimer complètement le panier  (!!!)"

### Test pour savoir si le panier de copie existe et est non nul
if test -s /tmp/panier_de_copie;
then
    ### si le panier de copie existe et est non nul:
    ### stocke le fichier correspondant au panier de copie dans la variable "paniercopie"
    paniercopie=$(cat /tmp/panier_de_copie)

    ### Demande quel type de modification est à apporter au panier (voir les variables choix possibles ci-dessus) parmi une liste
    reponse=$(zenity --title="Modification du panier de copie"  --width=500 --height=188 --list --radiolist --column "" --column="choisissez une modification du panier de copie:" TRUE "$rep1" FALSE "$rep2" FALSE "$rep3")
    ### si l'utilisateur choisit de retirer quelques entrées
    if [ "$reponse" = "$rep1" ];
    then
        ### le premier sed fait une colonne avec des "TRUE" et une autre avec les éléments de la panier
        ### le second sed remplace les caractères "espace" par des caractères spéciaux "espace insécable" (attention!) car zenity interprète les "espace" simples.
        ### sed remplace ensuite à l'inverse "espace insécable" par "espace" puis on stocke dans un fichier la liste des entrées à conserver
        paniercopie=$(echo $paniercopie | sed -s "s#\ \/#\nTRUE\n\/#g" | sed -s "s# # #g")
        zenity --list --checklist --width=1000 --height=500 --title="Panier" \
        --column='' --column="Fichiers à conserver dans le panier" \
        "TRUE"   $paniercopie | sed -s 's#|#\n#g'| sed -s "s# # #g" > /tmp/agarder
        ### On vérifie que le fichier contenant la liste des entrées à conserver existe et est non vide (zenity est parfois capricieux...)
        if test -s /tmp/agarder;
        then 
            cat /tmp/agarder > /tmp/panier_de_copie
            rm -rf /tmp/agarder
        else
            zenity --question \
            --text="Voulez-vous vraiment supprimer le panier de copie?"
            if [ $? -eq 0 ]
            then 
                ### on efface le panier et le fichier temporaire des entrées à conserver
                rm -rf /tmp/panier_de_copie /tmp/agarder
                ### on tue le(s) script qui crée le panier à l'aide d'un fichier dans lequel est stocké son PID puis on efface ce fichier
                kill -9 $(cat /tmp/panier_de_copie_lock)
                rm - rf /tmp/panier_de_copie_lock
            fi
        fi
    ### si l'utilisateur choisit de garder quelques entrées
    elif [ "$reponse" = "$rep2" ];
    then
        ### le premier sed fait une colonne avec des "FALSE" et une autre avec les éléments de la panier
        paniercopie=$(echo $paniercopie | sed -s "s#\ \/#\nFALSE\n\/#g" | sed -s "s# # #g")
        zenity --list --checklist --width=1000 --height=500 --title="Panier" \
        --column='' --column="Fichiers à conserver dans le panier" \
        "FALSE"   $paniercopie | sed -s 's#|#\n#g'| sed -s "s# # #g" > /tmp/agarder
        if test -s /tmp/agarder;
        then 
            cat /tmp/agarder > /tmp/panier_de_copie
            rm -rf /tmp/agarder
        else
            zenity --question \
            --text="Voulez-vous vraiment supprimer le panier de copie?"
            if [ $? -eq 0 ]
            then 
                ### on efface le panier et le fichier temporaire des entrées à conserver
                rm -rf /tmp/panier_de_copie /tmp/agarder
                ### on tue le(s) script qui crée le panier à l'aide d'un fichier dans lequel est stocké son PID puis on efface ce fichier
                kill -9 $(cat /tmp/panier_de_copie_lock)
                rm - rf /tmp/panier_de_copie_lock
            fi
        fi
    ### si l'utilisateur choisit d'effacer le panier
    elif [ "$reponse" = "$rep3" ];
    then 
        ### on efface le panier
        rm -rf /tmp/panier_de_copie
        ### on tue le(s) script qui crée le panier à l'aide d'un fichier dans lequel est stocké son PID puis on efface ce fichier
        kill -9 $(cat /tmp/panier_de_copie_lock)
        rm -rf /tmp/panier_de_copie_lock
    fi
else 
    ### si le panier de copie n'existe pas ou est vide, on affiche une gentille erreur
    zenity --error \
    --text="Il n'y a <b>pas de panier de copie</b> à modifier ou bien il est <b>vide</b>. 

                                 <big><b>☹</b></big> Désolé. <big><b>☹</b></big>"
fi

Je me retrouve avec le même problème que précédemment évoqué, à savoir même si on tue le sript qui génère la liste, la notification zenity reste...


Alors voilà, si vous pouviez m'aider à corriger les problèmes écrits en rouge, je serais aux anges. Je suis également ouvert à toutes suggestion sur mes scripts pour les améliorer... je suis un débutant qui souhaite apprendre!

Dernière modification par Alextazy (Le 19/10/2010, à 13:23)

Hors ligne

#7 Le 19/10/2010, à 14:44

Hizoka

Re : Scripts pour remplacer un supercopier...

Salut, quelmques simplifications que je ferais, il est évidant que je suis ma façon de coder, je ne force à rien et je n'ai pas toujours raison...

General :
le ; de fin de ligne ne sert à rien dans tous tes cas, ex :

if [ $? == 0 ];

=>

if [ ${?} == 0 ]

le ; te servirait si tu ecrivais :

if [ $? == 0 ]; then ....

entour tes variables de {}, c'est plus lisible, ca evite les erreurs et ça apporte des avantages smile

$test => ${test}

Change tes :

test -s /tmp/panier_de_copie;

=>

[[ -s  /tmp/panier_de_copie ]]

Tu peux rassembler tes zenity en une ligne comme par ex :

        zenity --notification\
          --window-icon="info" \
          --text="Panier copie en cours";

=>

        zenity --notification --window-icon="info" --text="Panier copie en cours"

Es-tu sûr d'avoir besoin de -r dans tes :

rm -rf /tmp/panier_de_copie*

par exemple ? Le -r veut dire qu'il est reccursif, donc efface les dossiers aussi.

Script 1 :

chemin=$(echo -e "${NAUTILUS_SCRIPT_SELECTED_URIS//\%/\\x}");
chemin=$(echo $chemin | sed -e 's/file:\/\///g');

=>

chemin= "${NAUTILUS_SCRIPT_SELECTED_URIS//\%/\\x}" chemin="${chemin#file://}"

tu peux rassembler tes lignes en 1 et en n'utilisant que du bash donc plus rapide smile

nom_du_script=$(echo ${0##*/})
pidof -x $nom_du_script | sed 's#'$$'##g'>> /tmp/panier_de_copie_lock

=>

nom_du_script="${0##*/}"
pidof -x ${nom_du_script} | sed 's#'$$'##g' >> /tmp/panier_de_copie_lock

le echo est inutile.

echo $chemin  | sed -s 's/\ \//\n\//g' >> /tmp/panier_de_copie;

=>

sed -s 's/\ \//\n\//g' <<< "${chemin}" >> /tmp/panier_de_copie;

Tu peux charger les variables dans les commandes via <<< "${variable}"

        zenity --notification\;

Le 1er \ pose probleme car pas d'espace avant.
et plutot que de mettre un ;, mets un && pour lancer l'autre zenity, car si on kill zenity notification, ca lance quand meme la fenetre d'edition.
Donc :

zenity --notification --window-icon="info" --text="Panier copie en cours" && zenity --text-info --title="panier éditable" --width=1000 --height=500 --filename=/tmp/panier_de_copie --editable > /tmp/panier_de_copie_tmp

ou avec tes \ si tu veux (ca diminue la taille du fichier code, c'est tout...).

cat /tmp/panier_de_copie_tmp > /tmp/panier_de_copie

et pourquoi pas cp -f ? (idem script 3)

Script 2 :
Donc ton script ne fonctionne que sous gnome ou la présence de gnome-terminal
regarde du coté de la variable ${TERM}

    if [ $? -eq 1 ]; then
        rm -rf /tmp/panier_de_copie
        kill -9 $(cat /tmp/panier_de_copie_lock)
        rm - rf /tmp/.lock_panier_de_copie
    fi

=>

    [ $? -eq 1 ] && { rm -rf /tmp/panier_de_copie; kill -9 $(cat /tmp/panier_de_copie_lock); rm - rf /tmp/.lock_panier_de_copie; }

Tu peux le faire en une ligne, Pour le coup, bonne utilisation de if...; then

    zenity --error \
  --text="Il n'y a <b>pas de panier de copie</b> à modifier ou bien il est <b>vide</b>. 

                                 <big><b>☹</b></big> Désolé. <big><b>☹</b></big>"

=>

    zenity --error  --text="Il n'y a <b>pas de panier de copie</b> à modifier ou bien il est <b>vide</b>. 

<big><b>☹</b></big> Désolé. <big><b>☹</b></big>"

chez moi les tab (si c'en sont) posent problème... (idem pour le script 3)

Script 3 :

if [ "$reponse" = "$rep1" ];

=>

if [[ "${reponse}" = "${rep1}" ]]

Utilise plus les doubles crochets, ca evite quelques erreurs : http://abs.traduc.org/abs-fr/ch07.html
idem pour le elif...

paniercopie=$(echo $paniercopie | sed -s "s#\ \/#\nTRUE\n\/#g" | sed -s "s# # #g")

=>

paniercopie=$(sed -s "s#\ \/#\nTRUE\n\/#g ; s# # #g" <<< "${paniercopie}")

et hop, on evite des pipes ( | ), donc gain de temps

"TRUE"   $paniercopie | sed -s 's#|#\n#g'| sed -s "s# # #g"

=>

"TRUE"   $paniercopie | sed -s "s#|#\n#g ; s# # #g"

idem que ci dessus.

zenity --question \
            --text="Voulez-vous vraiment supprimer le panier de copie?"
            if [ $? -eq 0 ]
            then 
                ### on efface le panier et le fichier temporaire des entrées à conserver
                rm -rf /tmp/panier_de_copie /tmp/agarder
                ### on tue le(s) script qui crée le panier à l'aide d'un fichier dans lequel est stocké son PID puis on efface ce fichier
                kill -9 $(cat /tmp/panier_de_copie_lock)
                rm - rf /tmp/panier_de_copie_lock
            fi
## on efface le panier et le fichier temporaire des entrées à conserver && on tue le(s) script qui crée le panier à l'aide d'un fichier dans lequel est stocké son PID puis on efface ce fichier
zenity --question --text="Voulez-vous vraiment supprimer le panier de copie?" && { rm -rf /tmp/panier_de_copie /tmp/agarder; kill -9 $(cat /tmp/panier_de_copie_lock); rm - rf /tmp/panier_de_copie_lock; }

tu peux rassembler le tout et virer une verification.

Voilou smile
Je n'ai pas tester car je suis sous Kubuntu.

Bon courage.

Dernière modification par Hizoka (Le 19/10/2010, à 14:48)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#8 Le 19/10/2010, à 15:35

Alextazy

Re : Scripts pour remplacer un supercopier...

Woaaa! ça c'est de la réponse!  cool cool cool
J'essaye ça et je réponds dès que je peux! Merci pour la 1/2 leçon de bash smile!
J'espère que tes super indications résoudront mes problèmes, mais je suis confiant smile smile!

Hors ligne

#9 Le 19/10/2010, à 15:50

Totor

Re : Scripts pour remplacer un supercopier...

Bonsoir,

Désolé je n'ai pas le temps de regarder en détail tes scripts. Cependant quelque chose m'a sauté aux yeux wink

N'y voit aucune agressivité mais tu est l'heureux gagnant d'un :
award?v=kill%20-9&n=Alextazy
http://partmaps.org/era/unix/award.html#kill

wink

Dernière modification par Totor (Le 19/10/2010, à 16:07)


-- Lucid Lynx --

Hors ligne

#10 Le 19/10/2010, à 18:23

ehmicky

Re : Scripts pour remplacer un supercopier...

Pour la question des trailings newlines (backslash avant la newline), perso je trouve ça plus lisible avec quand il y a 3 long-options ou plus, en tout cas c'est une question de style.

Dernière modification par ehmicky (Le 19/10/2010, à 18:26)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#11 Le 19/10/2010, à 21:31

Hizoka

Re : Scripts pour remplacer un supercopier...

c'est perso en effet smile

moi je regroupe si le zenity n'est pas trop long


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#12 Le 19/10/2010, à 21:39

chopinhauer

Re : Scripts pour remplacer un supercopier...

Je vois que t'utilise NAUTILUS_SCRIPT_SELECTED_URIS et tu fais beaucoup de calculs pour ne sélectionner que les fichiers locaux. Tu pourrais aussi installer gvfs-bin et utiliser les commandes : gvfs-copy, gvfs-rm, etc…

Elles peuvent gérer toutes les URIS reconnus par Nautilus et pas seulement les fichiers locaux.


Pensez à donner un bon titre à vos sujets : cela permettra d'aider d'autres utilisateurs dans votre même situation. Ce n'est pas qu'en donnant des solutions qu'on aide, mais aussi en posant des bonnes questions et… facilement trouvables.

Hors ligne

#13 Le 19/10/2010, à 21:45

AnsuzPeorth

Re : Scripts pour remplacer un supercopier...

chopinhauer a écrit :

Je vois que t'utilise NAUTILUS_SCRIPT_SELECTED_URIS et tu fais beaucoup de calculs pour ne sélectionner que les fichiers locaux. Tu pourrais aussi installer gvfs-bin et utiliser les commandes : gvfs-copy, gvfs-rm, etc…

Elles peuvent gérer toutes les URIS reconnus par Nautilus et pas seulement les fichiers locaux.

Ou tout simplement $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS roll


Interface graphique pour bash, python ou autre: glade2script
Support Tchat: http://chat.jabberfr.org/muckl_int/inde … ade2script  (Hors ligne)

Hors ligne

#14 Le 21/10/2010, à 00:40

Alextazy

Re : Scripts pour remplacer un supercopier...

Hizoka a écrit :

chemin="${NAUTILUS_SCRIPT_SELECTED_URIS//\%/\\x}" chemin="${chemin#file://}"

... n'a pas l'air de fonctionner correctement... cela me génère

/home/alex/.gnome2/nautilus-scripts/000_mettre_dans_panier file:///home/alex/.gnome2/nautilus-scripts/001_copier_panier_ici file:///home/alex/.gnome2/nautilus-scripts/002_d\xC3\xA9placer_panier_ici file:///home/alex/.gnome2/nautilus-scripts/003_modifier_panier

au lieu de

/home/alex/.gnome2/nautilus-scripts/000_mettre_dans_panier
/home/alex/.gnome2/nautilus-scripts/001_copier_panier_ici
/home/alex/.gnome2/nautilus-scripts/002_déplacer_panier_ici
/home/alex/.gnome2/nautilus-scripts/003_modifier_panier

sad sad ;une indication peut-être, le 2nd "chemin" de la ligne est écrit en noir et non dans le beau violet caractéristique des variables...

Par contre

chemin=$(echo -e "${NAUTILUS_SCRIPT_SELECTED_URIS//\%/\\x}") chemin=$(echo $chemin | sed -e 's/file:\/\///g');

donne le bon résultat.

Pour ce qui est de l'utilisation de rsync plutôt que cp -f, c'est parce que je trouve son utilisation plus souple, avec une sortie (c'est bien le bon terme pour ce qu'il affiche dans le terminal lorsqu'il effectue sa tambouille?) sympa.

Pour ce qui est des "NAUTILUS_SCRIPT_SELECTED_URIS" à la place des plus simples "NAUTILUS_SCRIPT_SELECTED_FILE_PATHS", je les utilisais car j'ai l'espoir qu'un jour mes scripts fonctionnent aussi en non local... mais vous avez raison... c'est sans doute un peu tôt pour mon niveau hmm.

AnsuzPeorth: Es-tu sûr que "NAUTILUS_SCRIPT_SELECTED_FILE_PATHS" gèrent aussi les fichier/dossiers non locaux?

Je vais tout de même regarder tes histoires de gvfs-bin chopinhauer, bien qu'effectivement je cherchais à minimiser les dépendances (d'ailleurs je vais essayer de regarder du coté de la variable ${TERM} plutôt que gnome-terminal).

Merci pour le prix Totor ! lol Sympa comme prix pour vanner les gens tout en éradiquant les erreurs courantes! D'ailleurs ta "gentille pique" pique là où il faut... elle pointe un de mes plus gros problème... En réalité, j'utilisais le "-9" dans l'espoir (vain!) de tuer aussi les processus fils du script (la notification zenity) en même temps que le script lui-même... cela reste d'ailleurs le principal désagrément de mes scripts à mon sens, le reste n'est qu'amélioration (peut-être fondamental quand même) du fonctionnement. En fait comme je n'ai jamais touché à la programmation de toute ma vie avant ces scripts, j'apprends un peu par imitation... et parfois j'imite aussi les conneries sans doute avec ce kill -9! Je dois aussi faire des utilisations abusives de cat aussi entre autres... mais comme je tâtonne...

Pour essayer de tuer quand même le processus fils zenity, je m'oriente vers une commande du type:

ps -edf | grep $$ | awk '{ print $2 }' | sed -s 's#\n# #g'> /tmp/PID_panier_copie_et_zenity_fils

dans le script qui génère le panier, puis un

kill -9 $(PID_panier_copie_et_zenity_fils)

dans les autres scripts qui effacent à un certain moment le liste (avec effectivement encore sans doute un "-9" abusif...). Je récupère bien les bon PIDs à tuer, même s'il y en a plus en réalité que ce qu'il faut, mais ces autres ne correspondent que à des processus intermédiaires fermés immédiatement et 100% inutilisés. Leur meurtre me semble donc à priori sans conséquences (mais je peux me tromper!!). Le problème avec cette commande est que je ne sais pas où la placer, car il faut qu'elle s'exécute une fois la notification zenity lancée, mais sans pour autant passer sur la fenêtre zenity qui édite le panier... sinon c'est soit une fenêtre d'édition de panier qui apparaît en boucle...
Une idée pour ce souci de meurtre du fils zenity récalcitrant avec un autre script?

Quelqu'un as-t'il réellement testé mes scripts (en tant que nautilus scripts)? Y-at'il des suggestions (ou éloges dithyrambiques, qui sait tongue lol tongue !)  sur le fonctionnement?

Merci encore pour vos réponses... je suis en train de retravailler mes scripts avec vos indications...

Hors ligne

#15 Le 21/10/2010, à 00:58

ehmicky

Re : Scripts pour remplacer un supercopier...

Sinon le problème avec kill -9 n'est pas qu'il ne marche pas ou est redondant, mais qu'il ne peut pas être intercepté par un signal handler, contrairement à SIGTERM (signal par défaut), et donc ça empêche les programmes de nettoyer tout avant de clore, donc il suffit de faire :

kill PID

Sinon, pour ton problème, essaie :

pkill zenity

Si tu n'as pas de problème avec le fait que les autres programmes utilisant aussi zenity seront affectés (sinon y'a des options pour éviter d'affecter les autres programmes).

Dernière modification par ehmicky (Le 21/10/2010, à 01:20)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#16 Le 21/10/2010, à 07:39

Totor

Re : Scripts pour remplacer un supercopier...

Alextazy a écrit :

Je dois aussi faire des utilisations abusives de cat aussi entre autres... mais comme je tâtonne...

Il y a effectivement beaucoup à revoir sur tes scripts

Alextazy a écrit :

Pour essayer de tuer quand même le processus fils zenity, je m'oriente vers une commande du type:

ps -edf | grep $$ | awk '{ print $2 }' | sed -s 's#\n# #g'> /tmp/PID_panier_copie_et_zenity_fils

dans le script qui génère le panier

Ce n'est effectivement pas une bonne façon de procéder.

Alextazy a écrit :

, puis un

kill -9 $(PID_panier_copie_et_zenity_fils)

A moins que ce soit une erreur involontaire de ta part, ceci ne risque pas de donner grand chose car PID_panier_copie_et_zenity_fils étant le nom d'un fichier contenant uniquement des chiffres, il ne peut s'exécuter
Je pense que ce que tu voulais écrire est kill -9 $(cat PID_panier_copie_et_zenity_fils) et qui est à remplacer par kill -9 $(<PID_panier_copie_et_zenity_fils)


Comme je l'ai dit auparavant, je n'ai pas beaucoup de temps en ce moment.
Dès que j'en aurai, je me pencherai sur ce sujet qui m'intéresse en tant qu'utilisateur de supercopier lorsque je suis (malheureusement) sous Windows au TAF.

Dernière modification par Totor (Le 21/10/2010, à 07:39)


-- Lucid Lynx --

Hors ligne

#17 Le 21/10/2010, à 09:18

Alextazy

Re : Scripts pour remplacer un supercopier...

ehmicky: Ok pour le kill, c'est bien noté. Et oui, je n'utilise pas de kill (ou pkill) zenity pour ne pas affecter d'autres programmes... donc ta petite parenthèse:

ehmicky a écrit :

(sinon y'a des options pour éviter d'affecter les autres programmes)

m'intéresse au plus haut point! Comment en effet ne tuer que les processus zenity concernés par un autre script donné, sans connaitre directrement son nom ni son PID (à récupérer éventuellement dans un fichier...)?

totor a écrit :

Je pense que ce que tu voulais écrire est kill -9 $(cat PID_panier_copie_et_zenity_fils) et qui est à remplacer par kill -9 $(<PID_panier_copie_et_zenity_fils)

Oui effectivement c'est une erreur involontaire, que je ne fais plus normalement! Mais sinon, mis à part pour l'erreur, la manière est-elle correcte?

Hors ligne

#18 Le 21/10/2010, à 11:54

ehmicky

Re : Scripts pour remplacer un supercopier...

pkill te permet de filtrer en fonction du PPID (PID du parent), du SID (Session ID), du GID (Groupe ID), du PGID (GID du parent), du RUID (identification de l'user) et de l'EUID (identification de l'user, après application du SUID). Je pense que tu as toujours moyen de récupérer ces données, par contre j'ai pas encore le courage de vraiment regarder ton script pour te dire exactement une ligne de commande.
Si ton problème, c'est que tu peux lancer plusieurs instances du script, et que tu veux pas supprimer les autres instances en cours en en interrompant une, je pense que si tu choppes le PID du script en cours via $$ avant d'invoquer zenity, ce sera donc le PPID des subshells lancés par zenity, et donc pkill -P Ce_PID devra clore ce script et le zenity invoqué, sans clore les autres instances du même script et leur zenity respectifs.

Dernière modification par ehmicky (Le 21/10/2010, à 12:00)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#19 Le 21/10/2010, à 13:50

Hizoka

Re : Scripts pour remplacer un supercopier...

chemin="${NAUTILUS_SCRIPT_SELECTED_URIS//\%/\\x}" chemin="${chemin#file://}" chemin="${chemin//file:\/\//$'\n'}"

devrait mieux fonctionner.


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#20 Le 21/10/2010, à 19:09

Alextazy

Re : Scripts pour remplacer un supercopier...

ehmicky: Ok pour le kill, c'est bien noté. Et oui, je n'utilise pas de kill (ou pkill) zenity pour ne pas affecter d'autres programmes... donc ta petite parenthèse:

ehmicky a écrit :

(sinon y'a des options pour éviter d'affecter les autres programmes)

m'intéresse au plus haut point! Comment en effet ne tuer que les processus zenity concernés par un autre script donné, sans connaitre directrement son nom ni son PID (à récupérer éventuellement dans un fichier...)?

totor a écrit :

Je pense que ce que tu voulais écrire est kill -9 $(cat PID_panier_copie_et_zenity_fils) et qui est à remplacer par kill -9 $(<PID_panier_copie_et_zenity_fils)

Oui effectivement c'est une erreur involontaire, que je ne fais plus normalement! Mais sinon, mis à part pour l'erreur, la manière est-elle correcte?

Hizoka : toujours pas... il me rajoute des retours à la ligne en trop et les caractères accentués merdoient également...

Hors ligne

#21 Le 21/10/2010, à 19:25

ehmicky

Re : Scripts pour remplacer un supercopier...

Double post volontaire ? Je t'ai répondu en haut (même si d'autres solutions peut-être meilleures sont possibles)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#22 Le 21/10/2010, à 22:03

Hizoka

Re : Scripts pour remplacer un supercopier...

donne un exemple de retour de NAUTILUS_SCRIPT_SELECTED_URIS


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#23 Le 22/10/2010, à 13:41

Alextazy

Re : Scripts pour remplacer un supercopier...

ehmicky: désolé, cafouillage... j'avais écris cette réponse que je n'avais pas envoyée... puis j'en ai écris une seconde sur un nouvel onglet après ta réponse et gourage, j'ai envoyé l'ancienne désolé. hmm . J'ai d'ailleurs essayé pkill et c'est effectivement cela qu'il me fallait! Merci beaucoup pour le tuyau!

Hizoka: tu souhaite quelque chose comme ça?:

echo -e "${NAUTILUS_SCRIPT_SELECTED_URIS}"> /tmp/test1

et voilà le fameux /tmp/test1:

file:///home/alex/.gnome2/nautilus-scripts/000_mettre_dans_panier file:///home/alex/.gnome2/nautilus-scripts/001_copier_panier_ici file:///home/alex/.gnome2/nautilus-scripts/002_d%C3%A9placer_panier_ici file:///home/alex/.gnome2/nautilus-scripts/003_modifier_panier

Mon code originel (non optimisé sans doute, soit) me donne le bon résultat, alors ce n'est pas ma principale priorité en fait... mais tu as raison, je devrais creuser cela tout de même.

Sinon, suivants vos conseils (respectés suivant mes capacités) j'ai fais une sorte de version 1.01 des scripts:

Mise dans le panier

#!/bin/bash

### sélectionne ce qu'il y a "sous le clic" ### met sous la forme d'une liste, 
### avec sur chaque ligne un chemin complet de fichiers que l'on veut rajouter à la liste
### les "files:" sont remplacés par un retour charriot, les "%20" par des 'backslash espace'
chemin=$(echo -e "${NAUTILUS_SCRIPT_SELECTED_URIS//\%/\\x}") chemin=$(echo "$chemin" | sed -e 's/file:\/\///g');

### réupère le nom du script, cherche tous les PIDs des scripts ayant ce nom et stocke tout ceci dans un fichier
nom_du_script="${0##*/}"
pidof -x $nom_du_script >> PID_panier_de_copie

### Test pour savoir si le panier de copie existe et est non nul
if [[ -s /tmp/panier_de_copie ]]
then 
    ### si le panier de copie existe et est non nul, la liste des fichiers/dossiers à mettre dans le panier de copie est stockée (à la suite) dans un fichier puis termine le script
    sed -s 's/\ \//\n\//g' <<< "${chemin}" >> /tmp/panier_de_copie;
    break
else
    ### Si le panier n'existe pas encore ou bien est vide, la liste des fichiers/dossiers à mettre dans le panier de copie est stockée (à la suite) dans un fichier...
    # echo $chemin  | sed -s 's/\ \//\n\//g' >> /tmp/panier_de_copie; # je garde l'ancienne commande car je n'ai pas encore compris la nouvelle...
    sed -s 's/\ \//\n\//g' <<< "${chemin}" >> /tmp/panier_de_copie;
    ### ... et tant que celui-ci existe et est non vide...
    while [[ -s /tmp/panier_de_copie ]]
        do 
        ###... affiche une notification
        ### Si on clique sur cette notification, il s'affiche une fenêtre contenant le panier de copie que l'on peut éventuellement éditer
        zenity --notification --window-icon="/usr/share/icons/gnome/scalable/actions/list-add.svg" --text="Panier copie en cours" && zenity --text-info --title="panier éditable" --width=1000 --height=500 --filename=/tmp/panier_de_copie --editable > /tmp/panier_de_copie_tmp

        ### Si l'utilisateur a cliqué sur "fermer" (pas fermer la fenêtre sur la croix de sortie qui équivaut à annuler)...
        if [[ $? == 0 ]]
        then
            ### Si le panier que l'on a éditer existe et est non vide...
             if [[ -s /tmp/panier_de_copie_tmp ]]
            then
                ### ...on copie ce panier édité à la place du panier de copie, puis on supprime le panier édité
                cat /tmp/panier_de_copie_tmp > /tmp/panier_de_copie
                rm -f /tmp/panier_de_copie_tmp*
            else 
                ### ...sinon, on supprime le panier de copie et le panier édité; cette première suppression entraine la sortie de la boucle, sinon, après chaque "édition" ou fermeture de la fenêtre d'édition, la notification réaparait, et on peu re-cliquer dessus pour l'édition du panier...
                rm -f /tmp/panier_de_copie*
            fi
        fi
    done
fi
### À la fin du script, on supprime le fichier contenant le(s) PID des scripts qui portent le nom de celui-ci
rm -f /tmp/panier_de_copie_lock
done

Copie du panier:

#!/bin/bash

### copie le panier de copie précédement crée à l'endroit du clic si le panier de copie existe et est non vide
if [[ -s /tmp/panier_de_copie ]]
then 
    xterm -T "Progression de la copie du panier par rsync" -e 'rsync -Hau -h --progress --no-relative -r --files-from="/tmp/panier_de_copie" / .'

### boite de dialogue qui demande si le panier doit être conservée pour utilisation ultérieure ("annuler" ou fermer la fenêtre) ou l'efface si la réponse est "OK"
    zenity --question \
    --text="Voulez-vous conserver le panier de copie?"

    if [[ $? -eq 1 ]]
    then rm -f /tmp/panier_de_copie* && pkill -P $(cat /tmp/PID_panier_de_copie) && rm - f /tmp/PID_panier_de_copie;
    fi

else
    zenity --error --text="Il n'y a <b>pas de panier de copie</b> à modifier ou bien il est <b>vide</b>. 

                                 <big><b>☹</b></big> Désolé. <big><b>☹</b></big>"
fi
done

Déplacer panier:

#!/bin/bash

### Vérifie si le panier de copie existe et est non vide
if [[ -s /tmp/panier_de_copie ]]
then 
     #### ouvre un terminal dans lequel rsync transfert les fichiers à l'endroit du clic puis supprime les fichiers sources (mais laisse des dossiers vides)
    xterm -T "Progression de la copie du panier par rsync" -e 'rsync -Hau -h --progress --no-relative --remove-source-files -r --delete-after --files-from="/tmp/liste_de_copie" / .'
    ### On supprime le panier (qui ne correspond plus à rien puisque les fichiers qui y sont listés n'existent plus)
    && rm -f /tmp/panier_de_copie* && pkill -P $(cat /tmp/PID_panier_de_copie) && rm - f /tmp/PID_panier_de_copie;
else
    ### si le panier de copie n'existe pas ou est vide, on affiche une gentille erreur
    zenity --error \
  --text="Il n'y a <b>pas de panier de copie</b> à modifier ou bien il est <b>vide</b>. 

                                 <big><b>☹</b></big> Désolé. <big><b>☹</b></big>"
fi
done

Modifier le panier:

#!/bin/bash

### Définition des variables qui correspondent aux différents choix possible
rep1="Retirer quelques entrées  ()"
rep2="Ne garder que quelques entrées  () "
rep3="Supprimer complètement le panier  (!!!)"

### Test pour savoir si le panier de copie existe et est non nul
if [[ -s /tmp/panier_de_copie ]]
then
    ### si le panier de copie existe et est non nul:
    ### stocke le fichier correspondant au panier de copie dans la variable "paniercopie"
    paniercopie=$(cat /tmp/panier_de_copie)

    ### Demande quel type de modification est à apporter au panier (voir les variables choix possibles ci-dessus) parmi une liste
    reponse=$(zenity --title="Modification du panier de copie"  --width=500 --height=188 --list --radiolist --column "" --column="choisissez une modification du panier de copie:" TRUE "$rep1" FALSE "$rep2" FALSE "$rep3")
    ### si l'utilisateur choisit de retirer quelques entrées
    if [[ "${reponse}" = "${rep1}" ]]
    then
        ### le premier sed fait une colonne avec des "TRUE" et une autre avec les éléments de la panier
        ### le second sed remplace les caractères "espace" par des caractères spéciaux "espace insécable" (attention!) car zenity interprète les "espace" simples.
        ### sed remplace ensuite à l'inverse "espace insécable" par "espace" puis on stocke dans un fichier la liste des entrées à conserver
        paniercopie=$(echo $paniercopie | sed -s "s#\ \/#\nTRUE\n\/#g" | sed -s "s# # #g")
        zenity --list --checklist --width=1000 --height=500 --title="Panier" \
        --column='' --column="Fichiers à conserver dans le panier" \
        "TRUE"   $paniercopie | sed -s 's#|#\n#g'| sed -s "s# # #g" > /tmp/panier_de_copie_agarder
        ### On vérifie que le fichier contenant la liste des entrées à conserver existe et est non vide (zenity est parfois capricieux...)
        if [[ $? == 0 ]]
        then
            if [[ -s /tmp/panier_de_copie_agarder ]] 
            then 
                cat /tmp/panier_de_copie_agarder > /tmp/panier_de_copie
                rm -rf /tmp/panier_de_copie_agarder
            #else
            #    zenity --question \
            #    --text="Voulez-vous vraiment supprimer le panier de copie?"
            #    if [[ $? == 0 ]]
            #    then 
                    ### on efface le panier et le fichier temporaire des entrées à conserver
            #        rm -rf /tmp/panier_de_copie /tmp/panier_de_copie_agarder
                    ### on tue le(s) script qui crée le panier à l'aide d'un fichier dans lequel est stocké son PID puis on efface ce fichier
            #        kill -9 $(cat /tmp/panier_de_copie_lock)
            #        rm - f /tmp/panier_de_copie_lock
            #    fi
            fi
        fi
    ### si l'utilisateur choisit de garder quelques entrées
    elif [ "$reponse" = "$rep2" ];
    then
        ### le premier sed fait une colonne avec des "FALSE" et une autre avec les éléments de la panier
        paniercopie=$(echo $paniercopie | sed -s "s#\ \/#\nFALSE\n\/#g" | sed -s "s# # #g")
        zenity --list --checklist --width=1000 --height=500 --title="Panier" \
        --column='' --column="Fichiers à conserver dans le panier" \
        "FALSE"   $paniercopie | sed -s 's#|#\n#g'| sed -s "s# # #g" > /tmp/panier_de_copie_agarder
        if [[ $? == 0 ]]
        then
            if [[ -s /tmp/panier_de_copie_agarder ]]
            then 
                cat /tmp/panier_de_copie_agarder > /tmp/panier_de_copie
                rm -f /tmp/panier_de_copie_agarder
            #else
            #    zenity --question \
            #    --text="Voulez-vous vraiment supprimer le panier de copie?"
            #    if [[ $? == 0 ]]
            #    then 
                ### on efface le panier et le fichier temporaire des entrées à conserver
            #    rm -rf /tmp/panier_de_copie /tmp/panier_de_copie_agarder
                ### on tue le(s) script qui crée le panier à l'aide d'un fichier dans lequel est stocké son PID puis on efface ce fichier
            #    kill -9 $(cat /tmp/panier_de_copie_lock)
            #    rm - rf /tmp/panier_de_copie_lock
            fi
        fi
    ### si l'utilisateur choisit d'effacer le panier
    elif [ "$reponse" = "$rep3" ];
    then rm -f /tmp/panier_de_copie* && pkill -P $(cat /tmp/PID_panier_de_copie) && pkill -P $(cat /tmp/PID_panier_de_copie) && rm - f /tmp/PID_panier_de_copie;
    fi
else 
    ### si le panier de copie n'existe pas ou est vide, on affiche une gentille erreur
    zenity --error \
    --text="Il n'y a <b>pas de panier de copie</b> à modifier ou bien il est <b>vide</b>. 

                                 <big><b>☹</b></big> Désolé. <big><b>☹</b></big>"
fi

Un script de mise en panier/édition "simplifié":

#!/bin/bash

chemin=$(echo -e "${NAUTILUS_SCRIPT_SELECTED_URIS//\%/\\x}") chemin=$(echo $chemin | sed -e 's/file:\/\///g');

nom_du_script="${0##*/}"
pidof -x $nom_du_script >> PID_panier_de_copie

if [[ -s /tmp/panier_de_copie ]]
then 
    echo ${chemin} | sed -s 's/\ \//\n\//g' >> /tmp/panier_de_copie;
    break
else
    echo ${chemin} | sed -s 's/\ \//\n\//g' >> /tmp/panier_de_copie;
    while [[ -s /tmp/panier_de_copie ]]
        do 
        zenity --notification \
        --window-icon="/usr/share/icons/gnome/scalable/actions/list-add.svg" \
        --text="Panier copie en cours" && paniercopie=$(cat /tmp/panier_de_copie) && paniercopie=$(echo $paniercopie | sed -s "s#\ \/#\nTRUE\n\/#g" | sed -s "s# # #g")
        zenity --list --checklist --width=1000 --height=500 --title="Panier" \
        --column='' --column="Fichiers à conserver dans le panier" \
        "TRUE"   $paniercopie | sed -s 's#|#\n#g'| sed -s "s# # #g" > /tmp/panier_de_copie_agarder;
        cat /tmp/panier_de_copie_agarder > /tmp/panier_de_copie
        rm -rf /tmp/panier_de_copie_agarder
        
    done
fi

Il doit rester de nombreuses optimisations, je le sais bien... Mais essayez-les (en nautilus scripts) quand même!

Dernière modification par Alextazy (Le 22/10/2010, à 19:59)

Hors ligne

#24 Le 22/10/2010, à 14:40

ehmicky

Re : Scripts pour remplacer un supercopier...

Encore une fois, je n'ai eu le courage de bien lire le script, mais je vois juste qu'il y a des passages tels :

echo ${chemin}

qui devraient être :

echo "${chemin}"

si $chemin est susceptible de contenir des espaces ou autre.
A moins que ce soit fait exprès (je n'ai pas encore vraiment regardé)

Dernière modification par ehmicky (Le 22/10/2010, à 14:43)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#25 Le 22/10/2010, à 20:00

Alextazy

Re : Scripts pour remplacer un supercopier...

Non, tu as raison ehmicky , je les ai corrigés d'ailleurs...

Hors ligne