Ouvrez un fichier texte dans un terminal et actualisez-le automatiquement chaque fois qu'il est modifié


15

Comment ouvrir un fichier texte dans un terminal avec une actualisation automatique instantanée à chaque fois qu'il est modifié?

J'ai regardé vimavec :set autoread, mais cela nécessite une entrée élémentaire (comme une pression de touche à l'intérieur vim) pour déclencher le rafraîchissement.

Je souhaite que l'actualisation automatique soit mains libres. Y a-t-il un hack pour faire ça?

J'utilise Crunchbang 11, mais je suis assez à l'aise avec le terminal.


À quoi ça sert? De quoi parle ce fichier? S'il s'agit d'un journal, il a généralement de nouvelles lignes ajoutées en bas, alors vous pouvez simplement utiliser tail -f $file.
jirib

Plus précisément, j'écris un script Python qui écrit un autre fichier texte, et pas seulement ajouter de nouvelles lignes en bas. Je voudrais surveiller ce fichier texte.
Kit

inotify .......?
jirib

Je ne connais pas inotify. En le recherchant, c'est une API à laquelle j'ai besoin d'accéder avec la programmation C, ce que je ne suis pas enclin à faire de sitôt. Je recherche une solution de commande shell.
Kit

1
Il existe une suite d'outils que vous pouvez utiliser à partir de la ligne de commande appelée, généralement inotify-tools. Ceux-ci utilisent une fonctionnalité intégrée au noyau appelée inotify. Chaque fois qu'un fichier est traité, un événement est envoyé via inotify sur lequel vous pouvez agir. Beaucoup de prog. langs. tels que Python, Perl, etc. ont des bibliothèques qui encapsulent l'API Inotify. Voir Wikipedia pg: en.wikipedia.org/wiki/Inotify
slm

Réponses:


27

Cela devrait vous montrer le fichier une fois par seconde:

watch -n 1 cat file

1
Voilà ce que je recherche. Merci! Je l'ai prolongé avecwatch -tpcn 1 pygmentize -g filename
Kit

@Kit attention watch -g, cela ne fonctionne pas comme vous vous en doutez .
terdon

@terdon, le -gcommutateur est en fait pour pygmentize. Quoi qu'il en soit, merci pour l'avertissement.
Kit du

Si le contenu du fichier est sur une page, en utilisant cela, vous ne pouvez pas faire défiler l'écran pour vérifier le reste du contenu du fichier.
CodyChan

1
Pourquoi pas juste watch -n 1 tail file?
Varun

8
tail -f /var/log/syslog

Affiche les mises à jour syslog à mesure qu'elles sont ajoutées au fichier.


Cela montre les lignes lorsqu'elles sont ajoutées correctement? OP a besoin d'un rafraîchissement complet.
Sean256

fonctionne aussi sur les fenêtres avec git-bash
David

3

J'utiliserais watchcomme l'autre réponse le suggère, mais juste pour vous montrer comment on peut aborder un problème apparemment compliqué en utilisant les blocs de construction fournis par un shell tel qu'Unix; une boucle while peut être un moyen simple d'effectuer votre boucle.

$ while [ 1 ]; do clear; date; cat <afile>; sleep 1 ;done

Exemple

$ while [ 1 ]; do clear; date; cat sample.txt; sleep 1 ;done
Fri Nov 15 09:17:39 EST 2013
1
2
3
4
5

L'écran s'efface puis après une seconde, cela s'affiche:

Fri Nov 15 09:17:40 EST 2013
1
2
3
4
5

2

Comme suggéré dans les commentaires, vous pouvez également l'utiliser inotifymême s'il est exagéré. De loin le plus simple est d'utiliser watch. Voici une façon de le faire avec inotify:

  1. Installez le inotify-toolspackage

    sudo apt-get install inotify-tools
    
  2. Utilisez inotifywatchpour vérifier les modifications de votre fichier. Exécutez-le en boucle et catle fichier si un changement est détecté (c'est pourquoi je greppour la chaîne total):

    while true; do 
      inotifywatch -e modify -t 1 kk 2>/dev/null | grep -q total && 
      echo "$(date;cat kk)"; 
    done
    

Passer -q(ou --quiet) à grepfera taire la ligne correspondante avec "total".
FichteFoll

@FichteFoll bon point (veuillez ignorer mon commentaire précédent si vous l'avez vu avant de le supprimer, j'étais lent). Merci, édité.
terdon

0

watch(1)est un outil vraiment utile. [1]

Je ne recommanderais pas d'utiliser catcependant.

Utilisez plutôt headou tailpour voir si vous avez besoin de voir le début ou la fin du fichier.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.