Vider le contenu d'un fichier texte

16

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.

sosytee
la source
5
Alternative: tail -n +1000 file.txt > file.txtdevrait 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).
Rinzwind
2
C'est en fait une meilleure option que d'effacer le fichier à des heures planifiées.
Bruno Pereira
1
@Rinzwind, cela ne fonctionnera pas car le fichier sera tronqué avant que tail n'essaye de le lire. Vous devez rediriger vers un nouveau fichier, puis remplacer l'original par le nouveau.
psusi
Vrai @psusi :) il doit y avoir une redirection supplémentaire.
Rinzwind

Réponses:

28

La manière la plus simple:

> filename

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:

sudo > filename

lorsque vous ne disposez pas des autorisations sur ce fichier. Mais vous pouvez utiliser:

sudo bash -c "> filename"
Radu Rădeanu
la source
quel type d'autorisations doit être modifié car il dit autorisation refusée, j'ai déjà fait chmod 755 au fichier, ou devrais-je en faire un nouveau message (je veux dire la question des autorisations)
sosytee
@sosytee Voir mes nouvelles modifications.
Radu Rădeanu
1
@sosytee Bien sûr que vous pouvez, mais utilisez sudo crontab -epour 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_Permissions
Radu Rădeanu
1
truncate filenameest un peu plus propre et plus simple que de rediriger la sortie vide vers le fichier et ne rencontre pas les problèmes avec sudo.
psusi
1
@psusi truncate -s 0 filenamepeut en effet faire l'affaire. Vous pouvez l'ajouter comme réponse.
Radu Rădeanu
19

Il existe un outil créé à cet effet:

truncate -s 0 filename

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:

echo -n > filename

Cela conserve également le même inode.

Notez que les deux truncateet echo -nne sont pas définis par POSIX .

Pour la conformité POSIX, utilisez cat /dev/null:

cat /dev/null > filename

Encore une autre façon, plus obscure et probablement pas agnostique au shell:

> filename

Si le fichier à tronquer a besoin des privilèges root pour être écrit, les lignes suivantes ne fonctionneront pas comme prévu:

sudo echo -n > filename
sudo cat /dev/null > filename
sudo > filename

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:

sudo sh -c "echo -n > filename"

L' utilisation que truncatevous n'avez pas besoin d' une telle solution de contournement , car l'accès en écriture ne se fait pas par la coque mais truncatequi est exécuté par l' aide des privilèges sudo sudo.

sudo truncate -s 0 filename

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:

lesmana
la source
il dit Autorisation refusée, ont utilisé le nom de fichier chmod 755 mais l'autorisation est toujours refusée
sosytee
2
peut-être que vous avez activé noclobber dans bash?
lesmana
La réponse la plus complète à ce jour
AbdelHady
4

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

piotrektt
la source
1
Je préfère cette option moi-même. Nous utilisons "fichier> 10 Mo" -> "tar.gz pour sauvegarder" "fichier vide". Et les sauvegardes sont supprimées après 900 jours.
Rinzwind
3

echo "" > foo_fileest 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.

Bruno Pereira
la source
il dit l'autorisation refusée, ont utilisé le nom de fichier chmod 755 mais l'autorisation est toujours refusée
sosytee
Pouvez-vous lire les autorisations de fichier avec votre utilisateur normal, s'il vous plaît?
Bruno Pereira
oui je peux lire le contenu en tant qu'utilisateur normal
sosytee