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?


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.


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.


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.


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
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.