#1 Le 12/10/2010, à 16: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!
#!/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 . 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 ... quelqu'un a une idée?
Hors ligne
#2 Le 12/10/2010, à 18: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, à 19: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 .
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 .
Hors ligne
#4 Le 12/10/2010, à 19: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, à 19: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, à 12:15
- Alextazy
Re : Scripts pour remplacer un supercopier...
Merci 1000x AnsuzPeorth!!!
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, à 10:54)
Hors ligne
#6 Le 19/10/2010, à 14: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 .
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. 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, à 14:23)
Hors ligne
#7 Le 19/10/2010, à 15: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
$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
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
Je n'ai pas tester car je suis sous Kubuntu.
Bon courage.
Dernière modification par Hizoka (Le 19/10/2010, à 15:48)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#8 Le 19/10/2010, à 16:35
- Alextazy
Re : Scripts pour remplacer un supercopier...
Woaaa! ça c'est de la réponse!
J'essaye ça et je réponds dès que je peux! Merci pour la 1/2 leçon de bash !
J'espère que tes super indications résoudront mes problèmes, mais je suis confiant !
Hors ligne
#9 Le 19/10/2010, à 16: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
N'y voit aucune agressivité mais tu est l'heureux gagnant d'un :
http://partmaps.org/era/unix/award.html#kill
Dernière modification par Totor (Le 19/10/2010, à 17:07)
-- Lucid Lynx --
Hors ligne
#10 Le 19/10/2010, à 19: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, à 19: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, à 22:31
- Hizoka
Re : Scripts pour remplacer un supercopier...
c'est perso en effet
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, à 22: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, à 22:45
- AnsuzPeorth
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.
Ou tout simplement $NAUTILUS_SCRIPT_SELECTED_FILE_PATHS
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, à 01:40
- Alextazy
Re : Scripts pour remplacer un supercopier...
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
;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 .
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 ! 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 !) 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, à 01: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, à 02: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, à 08:39
- Totor
Re : Scripts pour remplacer un supercopier...
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
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.
, 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, à 08:39)
-- Lucid Lynx --
Hors ligne
#17 Le 21/10/2010, à 10: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:
(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...)?
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, à 12: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, à 13: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, à 14: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, à 20: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:
(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...)?
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, à 20: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, à 23: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, à 14: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é. . 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, à 20:59)
Hors ligne
#24 Le 22/10/2010, à 15: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, à 15: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, à 21:00
- Alextazy
Re : Scripts pour remplacer un supercopier...
Non, tu as raison ehmicky , je les ai corrigés d'ailleurs...
Hors ligne