it-swarm.com.de

Wie liste ich unter Linux einen Dateinamen pro Ausgabezeile auf?

Ich benutze ls -a Befehl zum Abrufen der Dateinamen in einem Verzeichnis, aber die Ausgabe erfolgt in einer einzelnen Zeile.

So was:

.  ..  .bash_history  .ssh  updater_error_log.txt

Ich benötige eine eingebaute Alternative, um Dateinamen in einer neuen Zeile zu erhalten:

.  
..  
.bash_history  
.ssh  
updater_error_log.txt
195
fixxxer

Verwenden Sie die Option -1 (Beachten Sie, dass dies eine "Eins" -Ziffer und kein Kleinbuchstabe "L" ist), wie folgt:

ls -1a

Stellen Sie jedoch zunächst sicher, dass Ihr ls-1 Unterstützt. GNU coreutils (auf Standard-Linux-Systemen installiert) und Solaris tun dies; verwenden Sie jedoch im Zweifelsfall man ls Oder ls --help Oder überprüfen Sie die Dokumentation.

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

Ja, Sie können ls einfach einen Dateinamen pro Zeile ausgeben lassen:

ls -a | cat

Erläuterung: Der Befehl ls erkennt, ob die Ausgabe an ein Terminal oder an eine Datei oder Pipe erfolgt, und passt sie entsprechend an.

Also, wenn Sie Pipe ls -a to python es sollte ohne besondere maßnahmen funktionieren.

122
Peter G.

Ls ist für den menschlichen Verzehr bestimmt 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, den gewünschten Effekt zu erzielen. Da ls möglicherweise Nicht-ASCII- und Steuerzeichen in Dateinamen verfälscht, handelt es sich bei diesen Fällen um eine Teilmenge derjenigen, für die kein Dateiname von ls abgerufen werden muss.

In Python gibt es absolut keinen Grund, ls aufzurufen. Python hat die gesamte Funktionalität von ls integriert. Verwenden Sie os.listdir , um den Inhalt eines Verzeichnisses aufzulisten, und os.stat oder os , um Dateimetadaten abzurufen. Andere Funktionen in den os Modulen sind wahrscheinlich relevant für Ihr Problem.


Wenn Sie über ssh auf entfernte Dateien zugreifen, können Sie die Dateinamen relativ zuverlässig über sftp auflisten:

echo ls -1 | sftp remote-site:dir

Dadurch wird ein Dateiname pro Zeile ausgegeben. Anders als beim Dienstprogramm ls werden bei sftp nicht druckbare Zeichen nicht entstellt. Sie können Verzeichnisse, in denen ein Dateiname einen Zeilenvorschub enthält, immer noch nicht zuverlässig auflisten, was jedoch selten der Fall ist (denken Sie daran, dies ist ein potenzielles Sicherheitsproblem, kein Usability-Problem).

In python (Beachten Sie, dass Shell-Metazeichen in remote_dir Maskiert werden müssen):

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

Informationen zu komplexeren Interaktionen finden Sie im Stapelverarbeitungsmodus von sftp in der Dokumentation.

Auf einigen Systemen (Linux, Mac OS X, vielleicht einige andere Unices, aber definitiv nicht Windows) besteht ein anderer Ansatz darin, ein entferntes Dateisystem über ssh mit sshfs zu mounten und dann lokal zu arbeiten.

29
Gilles

du kannst ls -1

ls -l erledigt auch die Arbeit

10
ILF

Ganz einfach, solange Ihre Dateinamen keine Zeilenumbrüche enthalten:

find . -maxdepth 1

Wenn Sie dies in einen anderen Befehl umleiten, sollten Sie es wahrscheinlich vorziehen, die Dateinamen durch Null-Bytes anstelle von Zeilenumbrüchen zu trennen, da in einem Dateinamen keine Null-Bytes vorkommen können (Zeilenumbrüche können jedoch vorkommen):

find . -maxdepth 1 -print0

Das Drucken auf einem Terminal wird wahrscheinlich als eine Zeile angezeigt, da normalerweise keine Nullbytes 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.

1
8bittree