copie des fichiers d'un répertoire

Bonjour,
je veux copier tous les fichiers d’un répertoire personnel vers un répertoire d’un logiciel accessible par mot de passe, sous Linux et avec python:
subprocess.call(['gnome-terminal', '--','sudo', '-S', 'cp','-v', path_src+"/nom1.py", path_src+"/nom2.html", path_src+"/nom3.sh", path_dest]) fonctionne correctement mais je voudrais ne pas lister tous les fichiers, donc j’ai essayé:
subprocess.call(['gnome-terminal', '--','sudo', '-S', 'cp','-v', path_src+"/*", path_dest]) qui ne fonctionne pas. Merci de me dire pourquoi ?

Bonjour,

Je trouve étrange l’idée de lancer un émulateur de terminal gnome depuis Python : chez moi je lance Python dans un émulateur de terminal, et donc ce qu’il affiche s’affiche déjà naturellement dans le terminal dans lequel il est, je n’éprouve jamais le besoin d’en ouvrir un autre.

Aussi ça rend ton programme fragile : si gnome-terminal n’est pas installé il ne marche plus, c’est dommage, tu pourrais peut-être lancer sensible-terminal plutôt que gnome-terminal mais est-ce que c’est plus portable ? J’ignore.

Ensuite je trouve étrange d’utiliser sudo pour copier des fichiers de ton répertoire personnel, es-tu sûr d’en avoir besoin ?

Finalement je trouve aussi surprenant d’utiliser subprocess pour invoquer cp : dans shutil tu trouveras copytree qui fait (peut-être ?) ce que tu cherche à faire. Je pense que ton code peut donc se simplifier en :

import shutil
shutil.copytree(path_src, path_dest)

Mais j’imagine que tu as tes raisons pour utiliser sudo et gnome-terminal, donc je vais répondre à ta question :

“*” est interprété par un shell, hors lorsque tu exécutes gnome-terminal -- une commande, une commande est exécutée directement, sans passer par un shell, donc sans aucun bout de code chargé de substituer l’étoile.

Tu pourrais t’en sortir en demandant explicitement d’invoquer un bash puis à bash d’exécuter tes commandes :

gnome-terminal -- bash -c 'echo *; sleep 10'

et hop on voit que bash a remplacé l’étoile avant d’appeler echo.

Mais ça commence à faire un sacré empilement, je ne peux m’empêcher de proposer une solution alternative pour copier tes fichiers : rsync.

rsync a le bon goût de ne copier que ce qui a changé entre ton dossier et ton dossier chiffré : ça peut aller très vite ! Et il s’occupera tout seul de lister les fichiers à copier, pas besoin d’étoile.

subprocess.call(['gnome-terminal', '--','sudo', '-S', 'rsync', '-a', path_src + "/", path_dest + "/"])

tu peux même demander à rsync de supprimer dans path_dest les fichiers qui ne sont plus dans path_src en ajoutant l’option --delete mais attention a ne jamais t’embrouiller dans les paramètres : rsync a la réputation de supprimer très très vite.

Lis bien la doc de rsync pour comprendre pourquoi j’ai mis des “/” aux arguments de rsync, ils ont leur importance, enfin surtout celui du côté de path_src.

1 « J'aime »

Bonjour @mdk,
j’utilise Geany pour écrire mes scripts et j’y installe des modèles de fichiers perso. Je suis donc obligé de donner le mot de passe root pour pouvoir copier mes modèles dans un répertoire de Geany.
C’est pourquoi dans mon script Python j’ai utilisé subprocess.call(['gnome-terminal', '--','sudo', '-S', 'cp','-v',... ce qui n’est peut-être pas la bonne méthode …

Je ne comprends pas cette phrase, veux-tu dire que Geany t’interdit d’éditer des fichiers Python qui t’appartiendrait (et qui seraient dans ton dossier personnel) et te force a éditer des fichiers Python qui sont dans ses répertoires “ailleurs dans la hierarchie” ?

Geany possède ses propres modèles suivant la programmation utilisée et j’ajoute mes propres modèles que j’utilise ensuite pour faire mes scripts.
Je viens de corriger mon code suivant tes conseils en :
subprocess.call(['gnome-terminal', '--','sudo', 'bash', '-c', 'cp -v '+path_src+"/* "+path_dest]) et cela fonctionne.
Comment aurais-tu fais de ton côté ?

J’ignore ce que tu essaye de faire donc c’est dur de répondre. Je veux dire par là que je ne pense pas que tu essaye de juste copier path_src vers path_dest, mais que ça s’inscrit dans quelque chose de plus gros que j’ignore.

De mon côté j’essayerai surtout de comprendre pourquoi les fichiers ne sont pas stockés dans mon home là où j’ai des droits, pour me passer de sudo.

Ça me paraît forcément possible, mais je n’ai jamais utilisé Geany donc je suis un peu perdu, je n’ai jamais entendu parler de ses modèles. Il nous faudrait un utilisateurs de Geany pour nous éclairer :slight_smile:

Tu es sûr de na pas pouvoir faire cette configuration dans ton répertoire utilisateur (quelque part dans ~/.config/geany) ? General Template Information - Geany Wiki

Ça fait longtemps que je n’ai pas utilisé geany, mais je ne crois pas que tu aies besoin d’aller trifouiller dans les répertoires système (ça c’est réservé aux dépendances que tu installes au niveau de l’OS, et qui ont les droits pour ça).

2 « J'aime »

En 2 mots, mon script principal comprend des modules qui font chacun une tâche et entre autre je recopie des modèles de fichiers dans LibreOffice et dans Geany (un IDE). Mais j’ai voulu installer mes propres modèles là où étaient ceux de Geany, d’où l’accès root. Ce n’est peut-être pas la bonne solution j’en conviens…Merci néanmoins pour ton aide et je vais fouiller davantage Geany.

Bonjour @entwanne,
je vais essayer de (mieux) comprendre comment ajouter des modèles dans Geany, je n’ai surement pas pigé comment il fallait faire.

J’ai effectivement déniché le répertoire de configuration utilisateur dans lequel j’ai pu recopier mes modèles. Il y a quelque temps cela ne semblait pas fonctionner comme cela, mais bon…
j’ai fait un : shutil.copytree(path2, path3, dirs_exist_ok=True) qui fonctionne. Merci à tous ! :sweat_smile:

Youhou !

Je suis très content que tu puisse te passer de sudo, c’est beaucoup plus « normal » comme ça (et immensément moins risqué ! Un sudo rsync --delete avec une faute de frappe dans les arguments c’est la porte ouverte à flinguer son Linux, son home, ou les deux en même temps).

grâce à vous tout s’arrange !!