Vider le contenu d'un fichier

220

Je suis au courant de trois méthodes pour supprimer toutes les entrées d'un fichier.

Elles sont

  • >filename
  • touch filename
  • filename < /dev/null

Sur ces trois-là, j'abuse >filenamele plus car cela nécessite le moins de frappes.

Cependant, j'aimerais savoir quelle est la plus efficace des trois méthodes (s'il existe des méthodes plus efficaces) en ce qui concerne les gros fichiers journaux et les petits fichiers.

En outre, comment les trois codes fonctionnent-ils et suppriment-ils le contenu?

debal
la source
24
Qu'en est- il truncate -s 0 filename?
Martin Thoma
Très similaire à Différence entre chat et '>' pour mettre à zéro un fichier où vous trouverez plus d'informations.
Stéphane Chazelas
La première ne fonctionnera que si elle est appelée depuis la ligne de commande bash, mais ne fonctionnera pas si elle est exécutée dans un fichier .sh
Marco Marsala
8
touch ne supprime pas le contenu, mais modifie le temps d'accès au fichier. Il crée un fichier vide s'il n'en existait aucun.
hbogert

Réponses:

293

En réalité, le second formulaire touch filenamene supprime rien du fichier. Il crée uniquement un fichier vide s'il n'en existait pas ou met à jour la date de dernière modification d'un fichier existant.

Et le troisième filename < /dev/nullessaie de lancer le nom de fichier avec /dev/nullcomme entrée.

cp /dev/null filename travaux.

En ce qui concerne l'efficacité, la plus efficace serait truncate -s 0 filename; voir ici: http://linux.die.net/man/1/truncate .

Sinon, cp /dev/null filenameou > filenamesont les deux bien. Ils ouvrent et ensuite ferment le fichier en utilisant le paramètre truncate-on-open. cpouvre également /dev/null, ce qui le rend légèrement plus lent.

D'autre part, cela truncateserait probablement plus lent que > filenamelorsqu'il est exécuté à partir d'un script, car l'exécution de la commande tronquer nécessite que le système ouvre le fichier exécutable, le charge et l'exécute.

cendre
la source
9
Alors, pourquoi dites-vous que truncatec'est le plus efficace?
Stéphane Chazelas
7
L'opération troncature utilise l'appel système ftruncate () ou truncate () qui ne se soucie pas d'ouvrir le fichier. Cela évite également l'appel système close () que cp et les > filenameméthodes doivent appeler.
cendres
3
En fait, il (du moins celui de GNU) fait un open + ftruncate + close (en plus des nombreux appels système qu’il fait pour se charger et s’initialiser lui-même), car de toute façon, il faudrait créer le fichier s’il n’existait pas. et truncate(2)ne fait pas ça.
Stéphane Chazelas
Si nous utilisons touch filename, l'inode restera-t-il le même (à condition qu'il y ait déjà eu un fichier)?
pMan
1
@pMan oui, vous pouvez l'essayer et vérifier avecls -i
terdon
43

Une autre option pourrait être:

echo -n > filename

De la page de manuel de echo:

-n Do not print the trailing newline character.

Arturo Herrero
la source
Comment puis-je définir la taille? Dis si je veux 30000 caractères nuls?
Utilisateur
3

Il existe une commande intégrée ":", disponible dans sh, csh, bash et d'autres peut-être, qui peut être facilement utilisée avec l'opérateur de sortie redirigeant >tronquant un fichier:

#!/usr/bin/env bash
:> filename

Ce que j’aime, c’est qu’il n’a pas besoin de commandes externes comme "echo", etc.

Un gros avantage de tronquer des fichiers au lieu de les supprimer / les recréer est qu’il tail -f filenamen’est pas nécessaire de le rouvrir pour exécuter des applications fonctionnant avec ce fichier (par exemple, une personne ou un logiciel de surveillance, ...). Ils peuvent simplement continuer à utiliser le filedescriptor et obtenir toutes les nouvelles données.

Mirko Steiner
la source
man bashdécrit le :shell intégré comme n'ayant aucun effet.
Haxiel
Oui, et vous le redirigez >vers le fichier, qui le crée s’il n’existe pas et, s’il existe, vous le tronquez à zéro. Mieux dit: vous utilisez le :pour ne rien faire, et vous utilisez pour ne rien >rediriger vers un fichier et le tronquer.
Mirko Steiner
1
Pourquoi ferais-tu ça? > fileest suffisant pour tronquer un fichier. Vous n'avez besoin d'aucune commande, juste de l'opérateur de redirection.
terdon
1
parfois, > filenamene fonctionnera pas. par exemple, en zsh. mais : > filenamefonctionne encore.
CS Pei
Bash et sh semblent aimer, > myfilemais par exemple, les erreurs csh avec: Commande null invalide.
Mirko Steiner