現在のディレクトリ内のすべてのファイルを印刷するPythonワンライナー
質問
次の1つのライナーですべてのファイルをPythonで印刷するにはどうすればよいですか?
python -c "import sys;print '>>',sys.argv[1:]" | dir *.*
具体的には、python -cにパイプする方法を知りたいです。 DOSまたはCygwinの応答が受け入れられました。
解決
sys.stdinを読み取ることにより、Pythonスクリプトににパイプされたデータを読み取ることができます。例:
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
find . -type f -maxdepth 1 | xargs -L 1 printf ">>%s\n"
これはもちろんcygwinを使用しています。
ls | python -c "import sys; print sys.stdin.read()"
パイプの場合は標準入力を通常どおり読みます
パイプする方法を知りたい
‘ dir’の出力を送りたい場合は、間違った方法でパイプを回してしまいました。 Pythonに‘ dir’左側にいる必要があります。例:
dir "*.*" | python -c "import sys;[sys.stdout.write('>>%s\n' % line) for line in sys.stdin]"
(リスト内包表記のハックは、セミコロンの後の1行でブロックを導入する‘ for’ステートメントを許可されていないためです。)
明らかに、Pythonネイティブソリューション(‘ os.listdir’)は実際にははるかに優れています。
を参照具体的には、python -cにパイプする方法を知りたいです
プログラムのパイピングはプログラムの観点からは透過的です。プログラムが知っているのは、標準入力ストリームから入力を取得していることだけです
一般的に、次の形式のシェルコマンド
A | B
Aの出力をBの入力にリダイレクトします
Aが" asdf"を吐き出す場合標準出力にすると、Bは「asdf」を取得します。標準入力に
Pythonの標準入力ストリームは sys.stdin コード>