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


12

ls Druckt unterschiedlich, 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, in einer Zeile auszudrucken, als ob es sich um ein Terminal handelt, wenn dies nicht der Fall ist ? Es gibt ein -CArgument, dass sorta das tut, aber es wird es in 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, warum ich dies tun möchte, ist, dass ich die Dateien in einem Verzeichnis überwachen möchte, die sich schnell geändert haben. Ich hatte diese einfache Kommandozeile erstellt:

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

Das Uniq verhindert, dass es mein Terminal spammt und nur Änderungen anzeigt. Es wurde jedoch alles auf verschiedenen Linien gedruckt, was die Uniq unbrauchbar machte und das Rauschen erhöhte. Theoretisch könnte man das verwenden watch, 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

4
Wenn Sie ls an einen anderen Befehl weiterleiten, machen Sie etwas falsch. Was versuchst du eigentlich zu erreichen?
Justin

Justin, ich habe die Frage mit einer Erklärung aktualisiert.
Rory

Antworten:


16

Ich kenne keinen Schalter, der das könnte, aber Sie können Ihre Ausgabe durchleiten tr, um es zu tun:

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

14
ls | xargs

Es funktioniert für mich, es ist der einfachste Weg, den ich je gefunden habe. Hoffe das hilft dir auch.



4

Ah, jetzt, wo Sie die Frage aktualisiert haben ...

while true ; do echo * ; done | uniq

wird tun, was Sie gepostet haben, nur einfacher.

Es ist jedoch besser, wenn Sie etwas verwenden, das inotify verwendet, um dies zu tun

inotifywait -m . -e create,delete

Wenn Sie nicht 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)


0

Dies ist vielleicht das, wonach Sie suchen, aber ich habe Ihre Frage möglicherweise falsch verstanden, aber hier ist es :)

Einige Befehle, die es wert sind, untersucht zu werden:

watch - Führen Sie ein Programm regelmäßig aus und zeigen Sie die Vollbild-Xargs an. Erstellen Sie Befehlszeilen aus der Standardeingabe und führen Sie sie aus (-0, wenn Sie Dateien mit Leerzeichen usw. verarbeiten möchten.)

Sie können Folgendes tun, um die letzten 10 Dateien / Verzeichnisse anzuzeigen, die sich im Abstand von 2 Sekunden geändert haben (Standard für die Überwachung).

schau "ls -lart | tail -10"

Die Optionen -lart weisen ls an, ausführlich zu sein und nach Änderungszeit zu sortieren.

Wenn Sie wirklich nur die Dateien wollen, würde ich einfach so etwas tun:

watch "ls -lart | awk '{print \ $ 8}' | tail -10 | xargs"

oder nur um sie anzuzeigen:

ls -lart | awk '{print $ 8}' | Schwanz -10 | xargs


0

Sie können Back Ticks in der Shell verwenden, um dies zu erreichen:

echo -E `ls -1`

Funktioniert nicht mit allen Dateinamen. Versuchen Sie:touch ./-en
Kasperd

Das ist nur wichtig, wenn Sie keine Dateien haben, die mit [a-d]dieser Art beginnen . Wenn Sie es in einem Skript echo -Eausführen, wäre dies nicht zu unpraktisch und die nachfolgende neue Zeile spielt möglicherweise keine Rolle.
Küken

0

Dies funktionierte für mich, weil ich nicht nur das Ergebnis in einer Zeile drucken musste, sondern auch angeben musste, wie es getrennt werden musste, und Sie können dies mit ORS angeben

ls -1 | awk '{ ORS="|"; print; }'
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.