Python one-liner для печати каждого файла в текущем каталоге - PullRequest
1 голос
/ 05 марта 2009

Как я могу заставить следующий лайнер печатать каждый файл через Python?

python -c "import sys;print '>>',sys.argv[1:]" | dir *.*

В частности, хотелось бы знать, как передать в python -c. Ответы DOS или Cygwin приняты.

Ответы [ 6 ]

6 голосов
/ 05 марта 2009
python -c "import os; print os.listdir('.')"

Если вы хотите применить форматирование, как у вас в вопросе,

python -c "import os; print '\n'.join(['>>%s' % x for x in os.listdir('.')])"

Если вы хотите использовать трубу, используйте xargs:

ls | xargs python -c "import sys; print '>>', sys.argv[1:]"

или галочки:

python -c "import sys; print '>>', sys.argv[1:]" `ls`
4 голосов
/ 05 марта 2009

Если вы хотите распечатать все файлы:

find . -type f

Если вы хотите распечатать только файлы текущего каталога

find . -type f -maxdepth 1

Если вы хотите включить «>>» перед каждой строкой

find . -type f -maxdepth 1 | xargs -L 1 echo ">>"

Если вы не хотите пробела между ">>" и $ path из echo

find . -type f -maxdepth 1 | xargs -L 1 printf ">>%s\n"

Все это, конечно, использует cygwin.

4 голосов
/ 05 марта 2009

Вы можете прочитать данные, передаваемые по каналу в скрипт Python, прочитав sys.stdin. Например:

ls -al | python -c "import sys; print sys.stdin.readlines()"

Не совсем понятно, что вы хотите сделать (возможно, я глуп). Путаница исходит из вашего примера, который передает данные из скрипта Python.

3 голосов
/ 05 марта 2009
ls | python -c "import sys; print sys.stdin.read()"

просто читать stdin как обычно для труб

2 голосов
/ 05 марта 2009

хотел бы знать, как паять, хотя

У вас был неправильный канал, если вы хотите передать вывод «dir» в Python, «dir» должен быть слева. eg.:

dir "*.*" | python -c "import sys;[sys.stdout.write('>>%s\n' % line) for line in sys.stdin]"

(Хак с пониманием списка заключается в том, что вам не разрешено вводить в блок оператор "for" в одну строку после точки с запятой.)

Очевидно, что нативное решение Python ("os.listdir") на практике намного лучше.

1 голос
/ 05 марта 2009

В частности, хотел бы знать, как передать в питон -c

см. ответ Коббала

передача через программу прозрачна с точки зрения программы, все, что знает программа, это то, что она получает ввод из стандартного потока ввода

Вообще говоря, команда оболочки вида

A | B

перенаправляет выход A на вход B

поэтому, если A плюет «asdf» на стандартный вывод, то B получает «asdf» на свой стандартный ввод

стандартный поток ввода в Python: sys.stdin

...