Ich verwende den ls -a
Befehl, um die Dateinamen in einem Verzeichnis abzurufen, aber die Ausgabe erfolgt in einer einzelnen Zeile.
So was:
. .. .bash_history .ssh updater_error_log.txt
Ich benötige eine integrierte Alternative, um Dateinamen in einer neuen Zeile wie folgt abzurufen:
.
..
.bash_history
.ssh
updater_error_log.txt
ls
zu Python weiterleiten ,ls
wird eine Datei pro Zeile ausgegeben, wie in meiner Antwort erläutert.ls
die Ausgabe anpython
und den Single-Line - Ausgang in Python beobachtet?Antworten:
Verwenden Sie die
-1
Option (beachten Sie, dass dies eine "Ein" -Ziffer ist, kein Kleinbuchstabe "L") wie folgt:Stellen Sie jedoch zunächst sicher, dass Ihre
ls
Unterstützung-1
. GNU Coreutils (auf Standard-Linux-Systemen installiert) und Solaris tun dies; aber im Zweifelsfall verwendenman ls
oderls --help
oder die Dokumentation überprüfen. Z.B:quelle
ls --help
Ausgabe dokumentiert ... immer installiert ;-)linux ls one file per line
und dies war der Top-Artikel. Ich kann nicht glauben, wie wortreich die gewählte Antwort ist oder dass diese Antwort weniger Stimmen hat als die, die an cat weitergeleitet wird.ls -1
ftw.ls
Standardmäßig wird das-1
Verhalten verwendet, wenn der Ausgang nicht mit dem Terminal verbunden ist.Ja, Sie können problemlos
ls
einen Dateinamen pro Zeile ausgeben:Erläuterung: Der Befehl
ls
erkennt, ob die Ausgabe an ein Terminal oder an eine Datei oder Pipe erfolgt, und passt sie entsprechend an.Wenn Sie also
ls -a
auf Python weiterleiten, sollte dies ohne besondere Maßnahmen funktionieren.quelle
ls
es nur eine abgespeckte Version gibt, die nicht unterstützt wird-1
.
und..
"Dateien" in der Ausgabe angezeigt werden?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 allels
Funktionen integriert. Verwenden Sieos.listdir
diese Option, um den Inhalt eines Verzeichnisses aufzulisten undos.stat
oderos
um Dateimetadaten abzurufen. Andere Funktionen in denos
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:
Dadurch wird ein Dateiname pro Zeile gedruckt, und im Gegensatz zum
ls
Dienstprogramm werdensftp
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
):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.
quelle
Sie können verwenden
ls -1
ls -l
wird auch die Arbeit machenquelle
ls -l
sollte nicht verwendet werden.Einfach, solange Ihre Dateinamen keine Zeilenumbrüche enthalten:
Wenn Sie dies in einen anderen Befehl weiterleiten, sollten Sie Ihre Dateinamen wahrscheinlich lieber durch Null-Bytes als durch Zeilenumbrüche trennen, da Null-Bytes in einem Dateinamen nicht vorkommen können (aber Zeilenumbrüche können):
Das Drucken auf einem Terminal wird wahrscheinlich als eine Zeile angezeigt, da normalerweise keine Null-Bytes gedruckt werden. Einige Programme benötigen möglicherweise eine bestimmte Option, um durch Nullen getrennte Eingaben zu verarbeiten, z. B.
sort
's-z
. Ihr eigenes Skript müsste dies ebenfalls berücksichtigen.quelle