#1 Le 15/04/2016, à 09:17
- 2012alex2311
[résolu] Effacer un dossier + remplacer un fichier par un autre
Salut à tous,
J'aurais aimé savoir s'il était possible avec un fichier .sh (ou autrement) d'effacer un répertoire, svp ?
Par exemple, pour un jeu, je dois régulièrement vider (effacer) le dossier "Cache". A chaque fois, je dois aller dans le répertoire, etc... Je me demandais, s'il n'y avait pas un moyen de créer une fichier qui l'effacerait directement quand je clique dessus ?
Deuxième question, est-il possible de faire la même chose mais pour remplacer un fichier par un fichier du même nom mais venant d'un autre répertoire, ou bien renommer un fichier étant dans le même répertoire afin de prendre la place de l'autre.
Par exemple :
un fichier A et un fichier B dans le même répertoire ou dans un répertoire différent.
Je remplace A par B.
Et quand j'ai finis, avec un autre script, je remplace B par A.
Merci d'avance de votre aide.
Bonne journée.
Dernière modification par 2012alex2311 (Le 18/04/2016, à 17:23)
Hors ligne
#2 Le 15/04/2016, à 09:35
- cqfd93
Re : [résolu] Effacer un dossier + remplacer un fichier par un autre
Bonjour,
Oui, tout ça est possible, à coup de rm et mv.
− cqfd93 −
Hors ligne
#3 Le 15/04/2016, à 09:37
- Nuliel
Re : [résolu] Effacer un dossier + remplacer un fichier par un autre
Bonjour,
Pour la première question, le code du script (par exemple script.sh) est:
#!/bin/bash
rm -r /chemin/absolu/vers/Cache/*
Pour l’exécuter avec nautilus, il faut aller dans édition->préférences->comportement->cocher demander à chaque fois pour que tu puisses choisir entre afficher ou exécuter un script. Puis
chmod u+x script.sh
pour rendre le script exécutable.
Je ne comprends pas la deuxième question mais ça devrait se faire sans trop de problèmes à coup de mv.
Dernière modification par Nuliel (Le 15/04/2016, à 09:49)
Hors ligne
#4 Le 18/04/2016, à 13:28
- LeoMajor
Re : [résolu] Effacer un dossier + remplacer un fichier par un autre
pour un jeu
Bonjour,
Tu as incron pour surveiller les évènements sur les fichiers, les dossiers. La difficulté pour surveiller des évènements sur une application, est qu'elle peut être mono-pid, ou multi-pid, et que tu ne surveilles pas le bon pid, le bon exécutable.
J'ai fait des tests sur 0ad, chromium-browser, firefox et mon incron fonctionne très bien.
par exemple;
incrontab -l
/usr/lib/chromium-browser/chromium-browser IN_ALL_EVENTS,IN_NO_LOOP /usr/local/bin/application_events.sh $@ $# $%
si tu mets par exemple /usr/bin/chromium-browser ou /usr/bin/firefox, /usr/local/bin/application_events.sh te dira que ce n'est pas l'origine de l'application. Tu perds le focus sur les évènements et le log sera erratique.
/usr/bin/firefox --> /usr/lib/firefox/firefox
/usr/bin/chromium-browser ---> /usr/lib/chromium-browser/chromium-browser
/usr/games/pyrogenesis --> /usr/games/pyrogenesis
cat /usr/local/bin/application_events.sh
#!/bin/bash
# Display X si notify-send
export DISPLAY=:0
logfile=/home/toto/incron_application.log
ev[0]=$(date --rfc-3339=seconds); ev[1]=$1; ev[2]=$2; ev[3]=$3;
ev[4]=$(date +'%S%N')
last_record=( $(awk 'END { print $4" "$5" "$6 }' ${logfile}) )
application=$(basename $1)
ppidA=( $(ps xao ppid,pid,cmd | awk -v appli="$application" '$3~appli {ppids[$1]++; pids[$2]++; cmds[$1]=$3 }; END { for(ppid in ppids) if(!(ppid in pids) && !(cmds[ppid]~/awk|grep/)){print ppid,cmds[ppid]} }') )
#mono-pid vs multi-pids, perte d'évènements, de focus
if [ "${#ppidA[@]}" -eq 2 ]; then
if [ "x${ppidA[1]}" != "x${ev[1]}" ] && [ -f "${ppidA[1]}" ] ; then
message="erreur fatale: perte de focus ou application multi-pids\nremplacer ${ev[1]} par ${ppidA[1]}\n dans incrontab ou regle incron.d. + sudo service incron reload\n"
echo -e "$message" >> ${logfile}
notify-send "erreur fatale. ${logfile}"
exit -1
fi
pid=1
else pid=0
fi
ev[5]=$pid
if [ "$pid" -eq 1 ] && [ "x${last_record[2]}" == "x0" ]; then ev[6]="start"; notify-send "application $application ouverte" ;fi
if [ "$pid" -eq 1 ] && [ "x${last_record[2]}" == "x1" ]; then ev[6]="start++"; fi
if [ "$pid" -eq 1 ] && [ "x${last_record[2]}" == "x" ]; then ev[6]="start"; notify-send "application $application ouverte"; fi; #init si logfile est vide
if [ "$pid" -eq 0 ] && [ "x${last_record[2]}" == "x1" ]; then ev[6]="close"; notify-send "application $application fermée"; fi
if [ "$pid" -eq 0 ] && [ "x${last_record[2]}" == "x0" ]; then ev[6]="close++"; fi
if [ "$pid" -eq 0 ] && [ "x${last_record[2]}" == "x" ]; then ev[6]="close"; notify-send "application $application fermée"; fi; # init si logfile est vide
echo "${ev[@]}" >> ${logfile}
type de log que tu pourrais avoir
cat ~/incron_application.log
erreur fatale: perte de focus ou application multi-pids
remplacer /usr/bin/firefox par /usr/lib/firefox/firefox
dans incrontab. + service incron reload
2016-04-18 12:53:56+02:00 /usr/lib/firefox/firefox IN_OPEN 56241836478 1 start
2016-04-18 12:54:17+02:00 /usr/lib/firefox/firefox IN_CLOSE_NOWRITE 17691630782 0 close
2016-04-18 12:56:00+02:00 /usr/games/pyrogenesis IN_OPEN 00076026466 1 start
2016-04-18 12:56:00+02:00 /usr/games/pyrogenesis IN_ACCESS 00841820940 1 start++
2016-04-18 12:56:00+02:00 /usr/games/pyrogenesis IN_OPEN 00842641371 1 start++
2016-04-18 12:56:00+02:00 /usr/games/pyrogenesis IN_CLOSE_NOWRITE 00843198215 1 start++
2016-04-18 12:56:07+02:00 /usr/games/pyrogenesis IN_CLOSE_NOWRITE 07576867597 0 close
2016-04-18 13:17:17+02:00 /usr/bin/chromium-browser IN_OPEN 17638256770 0 close++
erreur fatale: perte de focus ou application multi-pids
remplacer /usr/bin/chromium-browser par /usr/lib/chromium-browser/chromium-browser
dans incrontab ou regle incron.d. + sudo service incron reload
2016-04-18 13:19:00+02:00 /usr/lib/chromium-browser/chromium-browser IN_OPEN 00895590565 1 start
2016-04-18 13:19:01+02:00 /usr/lib/chromium-browser/chromium-browser IN_OPEN 01314848589 1 start++
2016-04-18 13:19:01+02:00 /usr/lib/chromium-browser/chromium-browser IN_OPEN 01723787570 1 start++
2016-04-18 13:19:01+02:00 /usr/lib/chromium-browser/chromium-browser IN_OPEN 01899064773 1 start++
2016-04-18 13:19:02+02:00 /usr/lib/chromium-browser/chromium-browser IN_OPEN 02349590988 1 start++
2016-04-18 13:20:21+02:00 /usr/lib/chromium-browser/chromium-browser IN_CLOSE_NOWRITE 21668819207 0 close
ensuite tu as juste à insérer des fonctions, procédures, pour faire telle action, à l'exemple de notify-send.
un lsof -p ${ppidA[0]} devrait fonctionner aussi, pour voir les fichiers ouverts de l'application à l'instant t (pas vérifié)
Hors ligne
#5 Le 18/04/2016, à 14:04
- erresse
Re : [résolu] Effacer un dossier + remplacer un fichier par un autre
@LeoMajor: Tu es sûr de ne pas t'être trompé de sujet en postant cette réponse ???
Il ne s'agit que de supprimer un dossier ou de renommer un fichier, là...
Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois le problème solutionné, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.
Hors ligne
#6 Le 18/04/2016, à 14:15
- 2012alex2311
Re : [résolu] Effacer un dossier + remplacer un fichier par un autre
Bonjour,
Merci beaucoup
Bonjour,
Pour la première question, le code du script (par exemple script.sh) est:
#!/bin/bash rm -r /chemin/absolu/vers/Cache/*
Merci, au début, j'ai galéré un peu, puis j'ai compris qu'il fallait mettre un "\' s'il y avait des espaces dans le nom du dossier.
Du coup, j'ai créé un lanceur pour le mettre dans la barre des raccourcis car je n'arrivais pas à mettre le fichier .sh directement dans la barre des raccourcis.
Pour la deuxième question, j'ai essayé de bidouiller. L'idée, c'était de remplacer un fichier par un autre fichier du même nom sans l'effacer.
Par contre, j'aurais besoin d'aide, svp, car j'ai essayé quelque chose et ça ne marche pas.
Je pensais créer deux fichiers .sh avec un code du genre (et un second faisant l'inverse) :
#!/bin/bash
mv /chemin/ou/se/situe/fichier.exe /chemin/ou/je/deplace/
mv /chemin/ou/se/situe/mon/deuxieme/fichier.exe /chemin/ou/se/situe/
Quand je lance le script, le fichier en question est le même.
Hors ligne
#7 Le 18/04/2016, à 15:27
- erresse
Re : [résolu] Effacer un dossier + remplacer un fichier par un autre
Bonjour,
"Déplacer" un fichier suppose qu'il soit enregistré dans un nouvel emplacement ET supprimé de l'emplacement d'origine.
Si tu ne veux que "dupliquer" un fichier, il faut alors utiliser la commande "cp" (copy) et non "mv" (move).
Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois le problème solutionné, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.
Hors ligne
#8 Le 18/04/2016, à 16:04
- pingouinux
Re : [résolu] Effacer un dossier + remplacer un fichier par un autre
Bonjour,
Je ferais ceci, qui conserve les deux fichiers d'origine :
ln -sf /chemin_du_premier_fichier/fichier.exe /chemin_ou_j_utilise_l_un_ou_l_autre/fichier.exe
ou
ln -sf /chemin_du_second_fichier/fichier.exe /chemin_ou_j_utilise_l_un_ou_l_autre/fichier.exe
Hors ligne
#9 Le 18/04/2016, à 17:15
- 2012alex2311
Re : [résolu] Effacer un dossier + remplacer un fichier par un autre
Bonjour,
"Déplacer" un fichier suppose qu'il soit enregistré dans un nouvel emplacement ET supprimé de l'emplacement d'origine.
Si tu ne veux que "dupliquer" un fichier, il faut alors utiliser la commande "cp" (copy) et non "mv" (move).
Oui, c'est ce que je cherche à faire.
J'ai un ficher A dans un répertoire B.
Je veux envoyer le fichier A dans un répertoire C.
A la place, je veux mettre un autre fichier A dans le répertoire B.
Concernant le ln -sf, ça m'a fait quelque chose de bizarre. Le premier fichier est resté le même, dans le répertoire du second, j'ai eu un lien vers le premier fichier à la place de l'ancien fichier.
Hors ligne
#10 Le 18/04/2016, à 17:23
- 2012alex2311
Re : [résolu] Effacer un dossier + remplacer un fichier par un autre
Finalement, j'ai réussi à faire ce que je voulais, j'avais dû faire une faute de frappe.
Par contre, au final, j'ai bien fait deux fichiers .sh pour pouvoir inverser les deux.
Merci beaucoup de votre aide !
Hors ligne
#11 Le 18/04/2016, à 17:34
- 2012alex2311
Re : [résolu] Effacer un dossier + remplacer un fichier par un autre
Par contre, j'ai créé des lanceurs et quand je clique dessus, l'opération s'effectue correctement (aussi bien pour effacer le cache que pour déplacer les fichiers), mais le curseur reste bloqué en attente (facilement 30 secondes), c'est normal ? (espèce de petit rond avec un chargement à l'intérieur).
Car si je clique directement sur le script, je n'ai aucun problème, mais à chaque fois il me demande la confirmation entre afficher ou exécuter le script et je préfère que ça soit fait directement.
Hors ligne