Python one-liner pour imprimer tous les fichiers du répertoire en cours
Question
Comment puis-je faire en sorte que la doublure suivante imprime chaque fichier en Python?
python -c "import sys;print '>>',sys.argv[1:]" | dir *.*
Voudrais en particulier savoir comment canaliser un python -c. Réponses DOS ou Cygwin acceptées.
La solution
Vous pouvez lire les données transférées dans dans un script Python en lisant sys.stdin. Par exemple:
ls -al | python -c "import sys; print sys.stdin.readlines()"
Ce que vous voulez faire n’est pas tout à fait clair (peut-être que je suis stupide). La confusion provient de votre exemple, qui consiste à extraire des données d’un script python.
Autres conseils
python -c "import os; print os.listdir('.')"
Si vous souhaitez appliquer un formatage similaire à celui de votre question,
python -c "import os; print '\n'.join(['>>%s' % x for x in os.listdir('.')])"
Si vous souhaitez utiliser un canal, utilisez xargs
:
ls | xargs python -c "import sys; print '>>', sys.argv[1:]"
ou backticks:
python -c "import sys; print '>>', sys.argv[1:]" `ls`
Si vous souhaitez imprimer tous les fichiers:
find . -type f
Si vous souhaitez imprimer uniquement les fichiers du répertoire en cours
find . -type f -maxdepth 1
Si vous souhaitez inclure le " > > " avant chaque ligne
find . -type f -maxdepth 1 | xargs -L 1 echo ">>"
Si vous ne souhaitez pas laisser d'espace entre " > > " et $ path d'echo
find . -type f -maxdepth 1 | xargs -L 1 printf ">>%s\n"
Tout cela, c’est bien sûr avec cygwin.
ls | python -c "import sys; print sys.stdin.read()"
il suffit de lire stdin comme d'habitude pour les pipes
aimerait savoir comment diriger un tuyau
Vous avez mal interprété le tuyau. Si vous souhaitez transférer le résultat de ‘dir’ dans Python, ‘dir’ doit être situé à gauche. par exemple:
dir "*.*" | python -c "import sys;[sys.stdout.write('>>%s\n' % line) for line in sys.stdin]"
(Le piratage avec la compréhension de la liste est dû au fait que vous n'êtes pas autorisé à introduire une instruction "for" pour introduire un bloc sur une ligne après un point-virgule.)
Il est clair que la solution native pour Python ("os.listdir") est bien meilleure dans la pratique.
Voudrais en particulier savoir comment canaliser un python -c
voir la réponse de Cobob
la canalisation à travers un programme est transparente du point de vue du programme, tout ce que le programme sait, c'est qu'il reçoit des entrées du flux d'entrée standard
En règle générale, une commande shell de la forme
A | B
redirige la sortie de A vers l'entrée de B
donc si A crache " asdf " sur la sortie standard, B obtient alors "asdf". dans son entrée standard
le flux d'entrée standard en python est sys.stdin