Lsは人間が使用するように設計されており、その出力を解析しないでください。
シェルスクリプトでは、lsの出力の解析が機能するいくつかのケースが、目的の効果を達成する最も簡単な方法です。lsはファイル名の非ASCII文字と制御文字を壊す可能性があるため、これらのケースはからファイル名を取得する必要のないケースのサブセットですls
。
Pythonでは、呼び出す理由はまったくありませんls
。Pythonには、のすべてls
の機能が組み込まれています。使用するos.listdir
ディレクトリの内容を一覧表示したり、os.stat
またはos
ファイルのメタデータを取得します。os
モジュールの他の機能も、問題に関連している可能性があります。
sshを介してリモートファイルにアクセスしている場合、ファイル名を一覧表示するかなり堅牢な方法はsftpを使用することです。
echo ls -1 | sftp remote-site:dir
これは1行に1つのファイル名を印刷し、ls
ユーティリティとは異なり、sftp
印刷できない文字を壊しません。それでも、ファイル名に改行が含まれているディレクトリを確実に一覧表示することはできませんが、めったに行われません(これは潜在的なセキュリティの問題であり、使いやすさの問題ではないことに注意してください)。
Pythonでは(シェルのメタ文字はでエスケープする必要があることに注意してくださいremote_dir
):
command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir
remote_files = os.popen(command_line).read().split("\n")
より複雑な相互作用については、ドキュメントでsftpのバッチモードを検索してください。
一部のシステム(Linux、Mac OS X、おそらく他のunicesですが、間違いなくWindowsではありません)では、sshfsを使用してssh経由でリモートファイルシステムをマウントし、ローカルで作業するという別のアプローチがあります。