Lassen Sie ls alles in einer Zeile drucken (wie im Terminal)

Lassen Sie ls alles in einer Zeile drucken (wie im Terminal)

lswird unterschiedlich gedruckt, je nachdem, ob die Ausgabe an ein Terminal oder an etwas anderes erfolgt.

z.B:

$ ls .
file1  file2
$ ls . | head
file1
file2

Gibt es eine Möglichkeit, lsden Ausdruck in einer Zeile so zu gestalten, als ob er an ein Terminal gesendet würde, obwohl das nicht der Fall ist? Es gibt ein -CArgument, das dies in etwa tut, es wird den Ausdruck aber auf mehrere Zeilen aufteilen.

$ ls
file1  file10  file11  file12  file13  file14  file15  file16  file17  file18  file19 file2  file3  file4  file5  file6  file7  file8  file9
$ ls -C . | head
file1 file11 file13 file15 file17 file19 file3  file5  file7  file9
file10 file12 file14 file16 file18 file2 file4  file6  file8

Der Grund dafür ist, dass ich die Dateien in einem Verzeichnis überwachen möchte, die sich schnell ändern. Ich habe diese einfache Befehlszeile erstellt:

while [[ true ]] ; do ls ; done | uniq

Das Uniq verhindert, dass mein Terminal vollgespammt wird und zeigt nur Änderungen an. Allerdings druckte es alles auf verschiedene Zeilen, was das Uniq nutzlos machte und den Lärmpegel erhöhte. Theoretisch könnte man watches dafür verwenden, aber ich wollte eine Datei sehen, sobald sie erschien/verschwand.

Dies ist die endgültige Lösung:

while [[ true ]] ; do ls | tr '\n' ' ' ; done | uniq

Antwort1

ich kenne keinen Switch, der das könnte, aber Sie können Ihre Ausgabe durchleiten, trum dies zu tun:

ls | tr "\n" " " | <whatever you like>

Antwort2

ls | xargs

Bei mir funktioniert es. Es ist der einfachste Weg, den ich je gefunden habe. Ich hoffe, es hilft Ihnen auch.

Antwort3

Wenn lsdiese Option verfügbar ist, können Sie einen hohen Wert verwenden und möglicherweise das gewünschte Ergebnis erzielen:

ls -w 10000 -C . | head

Antwort4

ah, jetzt, wo Sie die Frage aktualisiert haben …

while true ; do echo * ; done | uniq

werde das machen, was Sie gepostet haben, nur einfacher.

Sie sind jedoch besser dran, wenn Sie etwas verwenden, das inotify verwendet, um dies zu tun, wie

inotifywait -m . -e create,delete

wenn Sie kein inotify haben, funktioniert so etwas auch gut:

import os
import time

last = set()
while True:
    cur = set(os.listdir('.'))
    added = cur-last
    removed = last-cur
    if added: print 'added', added
    if removed: print 'removed', removed
    last = set(os.listdir('.'))
    time.sleep(0.1)

verwandte Informationen