Wie stelle ich einen Dateinamen pro Ausgabezeile in Linux?
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
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.