Python one-liner для печати каждого файла в текущем каталоге
Вопрос
Как я могу заставить следующий лайнер печатать каждый файл через Python?
python -c "import sys;print '>>',sys.argv[1:]" | dir *.*
В частности, хотелось бы знать, как передать в python -c. Ответы DOS или Cygwin приняты.
Решение
Вы можете прочитать данные, отправленные в скрипт Python, прочитав sys.stdin. Например:
ls -al | python -c "import sys; print sys.stdin.readlines()"
Не совсем понятно, что вы хотите сделать (возможно, я глуп). Путаница исходит из вашего примера, который передает данные из скрипта Python.
Другие советы
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`
Если вы хотите распечатать все файлы:
find . -type f
Если вы хотите распечатать только файлы текущего каталога
find . -type f -maxdepth 1
Если вы хотите включить " > > " перед каждой строкой
find . -type f -maxdepth 1 | xargs -L 1 echo ">>"
Если вы не хотите использовать пробел между " > > " и $ path from echo
find . -type f -maxdepth 1 | xargs -L 1 printf ">>%s\n"
Все это, конечно, использует cygwin.
ls | python -c "import sys; print sys.stdin.read()"
просто прочитайте stdin как обычно для каналов
Хотелось бы узнать, как пайпить, хотя
Вы неправильно указали канал, если хотите передать вывод & # 8216; dir & # 8217; в Python, & # 8216; dir & # 8217; должно быть слева. например:.
dir "*.*" | python -c "import sys;[sys.stdout.write('>>%s\n' % line) for line in sys.stdin]"
(Хак с пониманием списка состоит в том, что вы не можете использовать оператор, представляющий блок & # 8216; for & # 8217; в одну строку после точки с запятой.)
Очевидно, что нативное решение Python (& # 8216; os.listdir & # 8217;) намного лучше на практике.
В частности, хотел бы знать, как передать в питон -c
см. ответ Коббала
передача через программу прозрачна с точки зрения программы, все, что знает программа, это то, что она получает данные из стандартного потока ввода
Вообще говоря, команда оболочки в форме
A | B
перенаправляет вывод A на вход B
так что если А плюет " asdf " к стандартному выводу, тогда B получает " asdf " в его стандартный ввод
стандартный поток ввода в Python - это sys.stdin код>