Fai stampare tutto su una riga (come nel terminale)


14

ls stampa in modo diverso a seconda che l'output sia verso un terminale o qualcos'altro.

per esempio:

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

C'è un modo per fare la lsstampa su una riga come se fosse su un terminale quando non lo è. C'è un -Cargomento che fa questo, ma lo dividerà in più righe.

$ 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

Il motivo per cui voglio fare questo è che voglio monitorare i file in una directory che stavano cambiando rapidamente. Avevo costruito questa semplice riga di comando:

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

Uniq gli impedisce di inviare spam al mio terminale e di mostrare solo le modifiche. Tuttavia, stava stampando tutto su linee differnet, il che rendeva inutile l'universo e aumentava la quantità di rumore. In teoria si potrebbe usare watchper questo, ma volevo vedere un file non appena appariva / scompariva.

Questa è la soluzione finale:

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

4
se stai eseguendo il piping su un altro comando, stai facendo qualcosa di sbagliato. Cosa stai effettivamente cercando di realizzare?
Justin,

Justin, ho aggiornato la domanda con una spiegazione.
Rory,

Risposte:


16

non conosco un interruttore che potrebbe farlo, ma è possibile reindirizzare l'output trper farlo:

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

16
ls | xargs

Funziona per me, è il modo più semplice che abbia mai trovato. Spero che anche questo ti aiuti.



4

ah, ora che hai aggiornato la domanda ....

while true ; do echo * ; done | uniq

farà ciò che hai pubblicato, semplicemente più semplice.

comunque, stai meglio usando qualcosa che usa inotify per fare questo ... come

inotifywait -m . -e create,delete

se non hai inotificato, anche qualcosa del genere funziona bene:

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

Questo potrebbe essere quello che stai cercando, ma potrei aver frainteso la tua domanda, ma qui va :)

Alcuni comandi vale la pena esaminare:

guarda - esegue periodicamente un programma, mostrando output xargs a schermo intero - crea ed esegue le righe di comando dall'input standard (-0 se si desidera gestire file con spazi ecc.)

Puoi fare qualcosa di simile al seguente per mostrare gli ultimi 10 file / directory che sono cambiati con un intervallo di 2 secondi (impostazione predefinita per watch)

guarda "ls -lart | tail -10"

le opzioni -lart dicono a ls di essere prolisso e ordinare in base al tempo di modifica.

Se davvero vuoi solo i file, farei semplicemente qualcosa del tipo:

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

o semplicemente per visualizzarli:

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


0

È possibile utilizzare i segni di spunta posteriori nella shell per ottenere questo risultato:

echo -E `ls -1`

Non funziona con tutti i nomi di file. Prova:touch ./-en
Kasperd,

Ciò importa solo se non hai file che iniziano con [a-d]quel tipo prima. Se lo stai eseguendo in uno script echo -Enon sarebbe troppo scomodo e la nuova riga finale potrebbe non avere importanza.
pulcini,

0

Questo ha funzionato per me perché avevo bisogno non solo di stampare il risultato in una riga, ma anche di specificare come doveva essere separato e puoi specificarlo con ORS

ls -1 | awk '{ ORS="|"; print; }'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.