J’essaie d’exécuter cette commande en utilisant Python:
findSyntax = "find . -maxdepth 2 -name '.config' | cpio -updm ../test1/" subprocess.Popen(findSyntax.split(' '))
Mais cette commande ne fonctionnerait tout simplement pas. Lorsque j’exécute cette commande, elle commence à répertorier tous les fichiers (pas seulement .config) sous. répertoire au-delà du maxdepth 2 … qui est une longue liste.
Qu’est-ce que j’oublie ici! Quelqu’un peut-il le signaler? Merci.
REMARQUE: J’ai également essayé d’exécuter subProcess.run
avec les mêmes résultats. J’ai été en mesure d’obtenir la partie de recherche en utilisant la commande os.system()
.
EDIT: Je voulais juste préciser que cette commande copiera les fichiers trouvés avec la structure de répertoire exacte intacte dans le nouvel emplacement (en créant des sous-répertoires si nécessaire). J’ai essayé cette commande sur le terminal bash, et ça marche bien. Mais je ne pouvais pas le faire fonctionner avec Python.
EDIT2: Ainsi, toute la commande fonctionne avec
os.system()
, mais je n’ai pasos.system()
comment le faire fonctionner avec unsubprocess
.os.system()
est supposé être obsolète, alors je serais très intéressé par la solution à l’aide desubprocess
.
S’il vous plaît regarder cette bonne réponse et cela aide aussi
Mais essentiellement, vous ne pouvez pas utiliser votre commande de sous-processus ci-dessus avec un tube.
Permet de parcourir l’exemple simple de tous les fichiers py
dans le répertoire courant: ( ls | grep py
)
C’est cassé:
import subprocess subprocess.call(['ls', '|', 'grep', 'py'])
Étant donné que le sous-processus ne fait qu’un processus à la fois et que vous effectuez un transfert, vous créez en réalité deux processus.
La méthode simple mais limitée (à la plate-forme) consiste à utiliser os.system
import os os.system('ls | grep py')
Cela fait littéralement passer une commande shell au système pour qu’elle soit exécutée.
Cependant, vous devez le faire avec un sous-processus en définissant vos canaux:
# Get all files and pass the stdout to a pipe p1 = subprocess.Popen(['ls'], stdout=subprocess.PIPE) # then pass that pipe to another process as stdin and do part 2 output = subprocess.check_output(['grep', 'py'], stdin=p1.stdout) print(output)
Donc, un copier coller pour votre exemple:
import subprocess p1 = subprocess.Popen("find . -maxdepth 2 -name '.config'".split(), stdout=subprocess.PIPE) output = subprocess.check_output("cpio -updm ../test1/".split(), stdin=p1.stdout)
Ou avec os
:
os.system("find . -maxdepth 2 -name '.config' | cpio -updm ../test1/")