Frage

Ich verwende ls -a Befehl, um die Dateinamen in einem Verzeichnis zu erhalten, aber die Ausgabe ist in einer einzigen Zeile.

Wie folgt aus:

.  ..  .bash_history  .ssh  updater_error_log.txt

Ich brauche eine eingebaute in alternativen Dateinamen zu erhalten, die jeweils auf einer neuen Zeile wie folgt aus:

.  
..  
.bash_history  
.ssh  
updater_error_log.txt
War es hilfreich?

Lösung

Verwenden Sie die -1 Option (beachten Sie, dies ist eine "Eins" Ziffer, nicht ein Kleinbuchstabe "L"), wie folgt aus:

ls -1a

Zunächst aber stellen Sie sicher, Ihre ls unterstützt -1. GNU coreutils (installiert auf Standard-Linux-Systeme) und Solaris zu tun; aber im Zweifelsfall Verwendung man ls oder ls --help oder die Dokumentation überprüfen. Z.

$ man ls
...
       -1     list one file per line.  Avoid '\n' with -q or -b

Andere Tipps

Ja, Sie können leicht ls Ausgang einen Dateiname pro Zeile machen:

ls -a | cat

. Erläuterung: Der Befehl ls Sinn, wenn die Ausgabe an einen Terminal oder in eine Datei oder ein Rohr und paßt dementsprechend

Wenn Sie also Rohr ls -a zu Python sollte es ohne besondere Maßnahmen arbeiten.

Ls für den menschlichen Verzehr ausgelegt ist, und Sie sollten nicht seine Ausgabe analysieren.

In Shell-Skripten gibt es einige Fälle, in denen die Ausgabe von ls Parsen funktioniert ist der einfachste Weg, um die gewünschte Wirkung zu erzielen. Da ls könnte mangle Nicht-ASCII-Zeichen und Steuerzeichen in Dateinamen, sind diese Fälle eine Teilmenge von denen, die nicht tun zu erhalten benötigen Sie einen Dateinamen von ls.

In Python gibt es absolut keinen Grund zu invoke ls. Python hat alle Funktionen, die von ls eingebaut. Verwenden Sie os.listdir den Inhalt eines Verzeichnisses aufzulisten und os.stat oder os Datei-Metadaten zu erhalten. Weitere Funktionen im os Module sind wahrscheinlich, um Ihr Problem als auch relevant sein.


Wenn Sie Remote-Dateien über ssh sind Zugriff auf eine relativ robuste Art und Weise Dateinamen der Auflistung ist durch SFTP:

echo ls -1 | sftp remote-site:dir

Dies druckt einen Dateinamen pro Zeile, und im Gegensatz zu dem ls Dienstprogramm, sftp nicht mangle nicht druckbare Zeichen. Sie werden immer noch nicht zuverlässig Liste Verzeichnisse der Lage sein, in dem ein Dateiname eine neue Zeile enthält, aber das ist selten getan (Sie erinnern sich dies als ein mögliches Sicherheitsproblem, kein Usability-Ausgabe).

In Python (das Shell-Metazeichen muss aufpassen entkommt in remote_dir sein):

command_line = "echo ls -1 | sftp " + remote_site + ":" + remote_dir
remote_files = os.popen(command_line).read().split("\n")

Für komplexere Interaktionen nachschlagen Charge des SFTP-Modus in der Dokumentation.

Auf manchen Systemen (Linux, Mac OS X, vielleicht einige andere Unix-Varianten, aber definitiv nicht Windows), ein anderer Ansatz ist es, ein Remote-Dateisystem über ssh zu montieren mit sshfs , und dann lokal arbeiten.

Sie verwenden können ls -1

ls -l wird auch die Arbeit tun

Einfach, solange Ihre Dateinamen enthalten keine Zeilenumbrüche:

find . -maxdepth 1

Wenn Sie diese in einen anderen Befehl sind Rohrleitungen, sollten Sie vielleicht lieber Ihre Dateinamen von Null-Bytes zu trennen, anstatt neue Zeilen, da Null-Bytes nicht in einem Dateinamen auftreten können (aber Zeilenumbrüche können):

find . -maxdepth 1 -print0

Druck, der auf einem Terminal wird wahrscheinlich als eine Zeile angezeigt werden, weil Null-Bytes ist nicht normal gedruckt. Einige Programme können brauchen eine bestimmte Option Griff Null begrenzt Eingang, wie sort des -z. Ihr eigenes Skript ähnlich Konto für diese benötigen würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top