ls
wird 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, ls
den 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 -C
Argument, 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 watch
es 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, tr
um 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 ls
diese 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)