J'ai un fichier texte dans mon répertoire personnel qui reçoit régulièrement des données via une tâche cron. Étant donné que le travail cron fournit des données dynamiques, je voudrais également définir un travail cron pour vider le contenu du fichier (le fichier doit toujours exister). Je n'ai pas besoin d'aide avec cron, juste la commande qui peut aider à vider le fichier.
command-line
sosytee
la source
la source
tail -n +1000 file.txt > file.txt
devrait supprimer 1000 lignes et conserver les lignes les plus récentes dans le fichier (vous ne savez jamais quand vous pourriez avoir besoin d'une partie de l'enregistrement récent pour suivre quelque chose).Réponses:
La manière la plus simple:
C'est une manière moins évidente et probablement moins lisible dans un script shell par d'autres, mais c'est tout ce dont vous avez besoin.
Parce que ce
>
n'est pas vraiment une commande (c'est une commande bash intégrée), vous ne pouvez pas utiliser:lorsque vous ne disposez pas des autorisations sur ce fichier. Mais vous pouvez utiliser:
la source
sudo crontab -e
pour ajouter le travail cron pour root, pas pour vous. Ou modifier l'autorisation de fichier à 766 (ou 666), et non à 755:sudo chmod 766 filename
. En savoir plus sur: codex.wordpress.org/Changing_File_Permissionstruncate filename
est un peu plus propre et plus simple que de rediriger la sortie vide vers le fichier et ne rencontre pas les problèmes avecsudo
.truncate -s 0 filename
peut en effet faire l'affaire. Vous pouvez l'ajouter comme réponse.Il existe un outil créé à cet effet:
Cela effacera le contenu mais ce sera toujours le même fichier (l' inode reste le même).
Ceci est important car certains programmes contiennent un descripteur du fichier "par inode". Supposons que vous «videz» un fichier en utilisant la méthode naïve de suppression et de recréation du fichier. Certains programmes peuvent toujours contenir une poignée sur l'ancien fichier (avec l'ancien contenu) même s'il n'est plus visible par des moyens habituels comme
ls
.Quelques liens vers plus de détails à la fin de cette réponse.
Une autre façon, peut-être plus facile à retenir:
Cela conserve également le même inode.
Notez que les deux
truncate
etecho -n
ne sont pas définis par POSIX .Pour la conformité POSIX, utilisez
cat /dev/null
:Encore une autre façon, plus obscure et probablement pas agnostique au shell:
Si le fichier à tronquer a besoin des privilèges root pour être écrit, les lignes suivantes ne fonctionneront pas comme prévu:
En effet, la redirection est effectuée par le shell avant même l'exécution de sudo. Cela signifie que l'accès en écriture au fichier se fait en utilisant les privilèges de l'utilisateur qui exécute le shell, pas les privilèges qui seront accordés par sudo.
Une solution de contournement consiste à reporter la redirection vers un shell exécuté à l'aide de privilèges sudo comme celui-ci:
L' utilisation que
truncate
vous n'avez pas besoin d' une telle solution de contournement , car l'accès en écriture ne se fait pas par la coque maistruncate
qui est exécuté par l' aide des privilèges sudo sudo.Pour quelques détails sanglants sur les programmes qui maintiennent le fichier ouvert même si le fichier a été supprimé, vous pouvez lire ce qui suit:
la source
Pour automatiser cela, vous pouvez utiliser logrotate. Créez simplement un fichier de configuration pour le fichier que vous souhaitez vider, ajoutez d'autres paramètres et vous pouvez le faire vider chaque jour automatiquement en fonction des critères que vous choisissez par exemple tous les jours, ou lorsque le fichier est plus grand que etc.
Jetez un œil ici sur la façon de configurer logrotate: http://linuxcommand.org/man_pages/logrotate8.html
la source
echo "" > foo_file
est un moyen simple de le faire, il remplacera tout le contenu de foo_file par "" ce qui le rendra dans ce cas vide.Vous pouvez également utiliser
cat /dev/null > foo_file
, qui lira le périphérique nul et écrasera votre fichier avec rien du tout.la source