Python one-liner per stampare tutti i file nella directory corrente
Domanda
Come posso fare in modo che il seguente liner stampi ogni file tramite Python?
python -c "import sys;print '>>',sys.argv[1:]" | dir *.*
In particolare, vorrei sapere come eseguire il pipe in un python -c. Sono state accettate le risposte DOS o Cygwin.
Soluzione
Puoi leggere i dati reindirizzati in uno script Python leggendo sys.stdin. Ad esempio:
ls -al | python -c "import sys; print sys.stdin.readlines()"
Non è del tutto chiaro cosa vuoi fare (forse sono stupido). La confusione deriva dal tuo esempio che sta eseguendo il piping dei dati da uno script Python.
Altri suggerimenti
python -c "import os; print os.listdir('.')"
Se vuoi applicare una formattazione come quella che hai nella tua domanda,
python -c "import os; print '\n'.join(['>>%s' % x for x in os.listdir('.')])"
Se vuoi usare una pipe, usa xargs
:
ls | xargs python -c "import sys; print '>>', sys.argv[1:]"
o backtick:
python -c "import sys; print '>>', sys.argv[1:]" `ls`
Se si desidera stampare tutti i file :
find . -type f
Se si desidera stampare solo i file della directory corrente
find . -type f -maxdepth 1
Se desideri includere " > > " prima di ogni riga
find . -type f -maxdepth 1 | xargs -L 1 echo ">>"
Se non desideri lo spazio tra " > > " e $ percorso da echo
find . -type f -maxdepth 1 | xargs -L 1 printf ">>%s\n"
Questo è tutto usando cygwin, ovviamente.
ls | python -c "import sys; print sys.stdin.read()"
basta leggere stdin normalmente per i tubi
però vorrebbe sapere come convogliare
Avevi il tubo nella direzione sbagliata, se volessi alimentare l'output di "dir" in Python, "dir" dovrebbe essere sulla sinistra. ad esempio:.
dir "*.*" | python -c "import sys;[sys.stdout.write('>>%s\n' % line) for line in sys.stdin]"
(L'hacking con la comprensione dell'elenco è dovuto al fatto che non è consentita un'istruzione "for" che introduce un blocco su una riga dopo un punto e virgola.)
Chiaramente la soluzione nativa di Python ("os.listdir") è molto meglio in pratica.
In particolare, vorrei sapere come eseguire il pipe in un python -c
vedi risposta di cobbal
il piping attraverso un programma è trasparente dal punto di vista del programma, tutto ciò che il programma sa è che sta ricevendo input dal flusso di input standard
In generale, un comando shell del modulo
A | B
reindirizza l'output di A come input di B
quindi se A sputa " asdf " allo standard output, quindi B ottiene "asdf" nel suo input standard
il flusso di input standard in python è sys.stdin