2
votes

Comment tronquer efficacement la tête du fichier?

Tout le monde connaît la fonction tronquer (fichier, taille) , qui modifie la taille du fichier à une taille donnée, en tronquant la queue du fichier. Mais comment faire de même, uniquement avec la troncature de pas la queue du fichier et sa tête?


2 commentaires

Lorsque le fichier est un fichier journal et que le programme qui y écrit garde le descripteur de fichier ouvert, aucune journalisation n'apparaîtra après le déplacement du fichier. Voir unix.stackexchange.com/a/122942/57293


ouvrez le fichier, puis sendfile (fd, fd, & offset, size) , je teste sur ubuntu 16, fonctionne bien, mais l'ancien noyau ne prend pas en charge


3 Réponses :


1
votes

Le seul moyen est de lire l'intégralité du fichier et de l'écraser à partir d'une position nécessaire.


0 commentaires

3
votes

En général, vous devez réécrire le fichier entier. Le moyen le plus simple est de sauter les premiers octets, de copier tout le reste dans un fichier temporaire et de renommer le fichier temporaire par-dessus l'ancien lorsque vous avez terminé. Une manière plus élaborée consiste à le réécrire sur place, de la même manière que le fonctionnement de memmove , avec lecture / recherche / écriture / recherche ou pré-lecture / écriture, puis tronquer le dernier bit une fois terminé.

Si vous utilisez une version récente de Linux (> = 3.15) et que vous disposez d'un système de fichiers pris en charge (actuellement ext4 ou xfs), et que le montant que vous souhaitez supprimer est un multiple de la taille du bloc du système de fichiers, vous pourrait utiliser le code fallocate (2) avec l'indicateur FALLOC_FL_COLLAPSE_RANGE . Notez que cette fonctionnalité n'est pas prise en charge par le posix_fallocate portable.


0 commentaires

1
votes

Vous pouvez simplement utiliser tail --lines = pour toujours limiter le fichier journal aux dernières lignes linecount . Cela fonctionne si vous n'essayez pas de tronquer à une taille de fichier spécifique / fixe.


0 commentaires