Ls ist für den menschlichen Verzehr konzipiert, und Sie sollten seine Ausgabe nicht analysieren .
In Shell-Skripten gibt es einige Fälle, in denen das Parsen der Ausgabe von ls der einfachste Weg ist, um den gewünschten Effekt zu erzielen. Da ls möglicherweise Nicht-ASCII- und Steuerzeichen in Dateinamen entstellt, sind diese Fälle eine Teilmenge derjenigen, bei denen kein Dateiname abgerufen werden muss ls
.
In Python gibt es absolut keinen Grund, sich aufzurufen ls
. In Python sind alle ls
Funktionen integriert. Verwenden Sie os.listdir
diese Option, um den Inhalt eines Verzeichnisses aufzulisten und os.stat
oder os
um Dateimetadaten abzurufen. Andere Funktionen in den os
Modulen sind wahrscheinlich auch für Ihr Problem relevant.
Wenn Sie über ssh auf Remote-Dateien zugreifen, können Sie Dateinamen mit sftp einigermaßen robust auflisten:
echo ls -1 | sftp remote-site:dir
Dadurch wird ein Dateiname pro Zeile gedruckt, und im Gegensatz zum ls
Dienstprogramm werden sftp
nicht druckbare Zeichen nicht entstellt. Sie können Verzeichnisse, in denen ein Dateiname eine neue Zeile enthält, immer noch nicht zuverlässig auflisten, dies wird jedoch nur selten durchgeführt (denken Sie daran, dass dies ein potenzielles Sicherheitsproblem und kein Usability-Problem ist).
In Python (Vorsicht, Shell-Metazeichen müssen in Escapezeichen enthalten sein remote_dir
):
command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir
remote_files = os.popen(command_line).read().split("\n")
Weitere Informationen zu komplexeren Interaktionen finden Sie im Batch-Modus von sftp in der Dokumentation.
Auf einigen Systemen (Linux, Mac OS X, möglicherweise einige andere Unices, aber definitiv nicht Windows) besteht ein anderer Ansatz darin, ein entferntes Dateisystem über ssh mit sshfs bereitzustellen und dann lokal zu arbeiten.