2013-09-05 13 views
16

Sto monitorando i nuovi file creati in una cartella in linux. Ogni tanto emetto un "ls -ltr" in esso. Ma vorrei che ci fosse un programma/script che lo avrebbe stampato automaticamente e solo le ultime voci. Ho fatto un breve ciclo di tempo per elencarlo, ma ripeteva le voci che non erano nuove e manterrebbe il mio schermo in rotazione quando non c'erano nuovi file. Ho imparato a conoscere "Watch", che non mostra quello che voglio e rinfresca ogni n secondi, ma io non voglio un'interfaccia ncurses, sto cercando qualcosa di simile coda:ls coda continua (lista file)

  • continuo
  • mostra solo il nuovo materiale
  • stampe nel mio terminale, in modo da poter eseguire in background e fare altre cose e vedere l'uscita di tanto in tanto si mescolino con tutto quello che sto facendo: D

Riassumendo : ottieni l'input, confronta con un input precedente, emetti solo ciò che è nuovo. Qualcosa che non suona come uno strumento così strano, posso vederlo usato anche per altre situazioni, quindi mi aspetterei che esista già, ma non ho trovato nulla. Suggerimenti?

+0

Cosa distribuzione utilizzi? –

+2

possibile duplicato di [Come monitorare continuamente la directory utilizzando il comando dnotify/inotify] (http://stackoverflow.com/questions/7566569/how-to-continuosly-monitor-the-directory-using-dnotify-inotify-command) – sehe

+0

Sto correndo la menta piperita. Sto cercando "inotify", non ne ho mai sentito parlare, a quanto pare non fa quello che voglio, forse mi aiuta a programmare una sceneggiatura per farlo. – msb

risposta

9

Se si ha accesso a inotifywait (disponibile dal pacchetto inotify-tools se siete su Debian/Ubuntu) si potrebbe scrivere uno script come questo:

#!/bin/bash 

WATCH=/tmp 

inotifywait -q -m -e create --format %f $WATCH | while read event 
do 
    ls -ltr $WATCH/$event 
done 

Questa è una battuta che ha vinto' t darvi le stesse informazioni che ls fa, ma sarà stampare il nome del file:

inotifywait -q -m -e create --format %w%f /some/directory 
+0

Grazie, ha funzionato. Ho fatto una sceneggiatura e sto ricevendo $ WATCH come parametro. Grazie! – msb

+0

Proprio come un commento aggiuntivo, lo script elenca tutti i nuovi file, ma la dimensione del file è in genere pari a zero, e questo perché la ls viene eseguita dopo che il file è stato creato ma prima che il suo contenuto sia aggiunto. Ho aggiunto un addormentato prima della ls e ora tutto è perfetto. :-) Puoi (o me) aggiungerlo alla tua risposta? – msb

+2

La modifica di '-e create' a' -e close_write' risolve il problema? –

29

è possibile utilizzare il comando molto pratico watch

watch -n 10 "ls -ltr" 

E riceverai un ls ogni 10 secondi.

E se si aggiunge uno tail -10 si otterranno solo i 10 più recenti.

watch -n 10 "ls -ltr|tail -10" 
+0

Questo ometterà i file in cui il creatore cambia i tempi del file a zeri molto poco dopo la ceazione. –

+0

come menzionato nella mia domanda originale, l'orologio non è esattamente quello che voglio, poiché ripeterà gli ultimi file se non ci sono abbastanza nuovi file, E ha un'interfaccia ncurses. : -/ – msb

+0

Oh, mi dispiace - ho perso la tua menzione di maledizioni nella mia eccitazione di rispondere. Io uso molto l'orologio – opentokix

0

Questo funziona in cygwin e Linux. Alcune delle soluzioni precedenti che scrivono un file causeranno il thrash del disco.

Questo script non ha quel problema:

SIG=1 
SIG0=SIG 
while [ $SIG != 0 ] ; do 
while [ $SIG = $SIG0 ] ; do 
    SIG=`ls -1 | md5sum | cut -c1-32` 
    sleep 10 
done 
SIG0=$SIG 
ls -lrt | tail -n 1 
done