Comment effacer le contenu d'un fichier de la ligne de commande?


280

J'ai un fichier journal qui contient un tas de choses dont je n'ai plus besoin. Je veux effacer le contenu.

Je sais comment imprimer le contenu à l'écran:

cat file.log

Je sais comment éditer le fichier, ligne par ligne:

nano file.log

Mais je ne veux pas supprimer chaque ligne une à la fois. Existe-t-il un moyen de le faire en une seule commande sans détruire le fichier?

Réponses:


466

En bash, juste

> filename

ça ira.

Cela vous laissera un nom de fichier vide .

ps

Si vous avez besoin d’ sudoappel, envisagez d’utiliser truncatecomme indiqué ici .


57
C’est probablement la commande la plus rapide de l’histoire de l’informatique
blarg

7
Au contraire, @ Arekkusandaa.Irujasukin; cela fonctionne très bien dans n’importe quelle version de Windows, tant que, comme mentionné, vous utilisez bashcomme shell et non par exemple cmd.exe, ni PowerShell, aucun d’eux n’étant assez POSIX pour être supposé gérer de telles choses.
DopeGhoti

124

Vous pouvez utiliser la commande utilisateur: tronquer

truncate -s 0 test.txt

("-s 0" pour spécifier la taille)

http://www.commandlinefu.com/commands/view/12/empty-a-file


3
La meilleure réponse possible, fonctionne lorsque vous n'êtes pas root (avec sudo) - sudo echo > filedonne simplement une erreur dans de tels cas.
Dmitry Verkhoturov

12
@DmitryVerkhoturov: voici sudo bash -c '> filename'comment vous utilisez les solutions Bash avec sudo.
Stuart P. Bentley le

1
brew install truncatesur os x avec homebrew installé.
xaxxon

Fonctionne plus vite que l'écho
Miao1007

34

Vous pourriez faire ceci:

echo -n "" > file.log

Utiliser >pour écrire l’entrée (null) echo -ndu fichier.

Utiliser ajouterait l'entrée nulle au fichier (en réalité, il ne >>ferait que l' incluretouch ).


Cela laissera un espace là-bas.
dmckee

Je reçois ceci: -bash:: commande non trouvée
Andrew

3
echo ""> vous donnera toujours un fichier avec un caractère (une nouvelle ligne.) Si vous voulez utiliser echo, utilisez "echo -n> file.log" pour echo null.
Dave Forgac

Il serait préférable d’utiliser une commande dédiée à sortie nulle comme true(ou son alias intégré :), bien qu’au final vous n’ayez pas besoin de commande (voir la réponse acceptée).
Stuart P. Bentley

Vous pourriez avoir des problèmes avec sudo.
Flapjack

27
: > file.log

Identique > filenameà Bash, mais fonctionne dans plus de coquillages (crédit) . Redirige la sortie de la commande trueintégrée (qui n'a aucune sortie) vers filename.


Je suis venu faire cette réponse, mais hélas, il est déjà là ... Prenez un vote positif.
Aaron Hall

5
Faites juste :> filename. Cela ne ressemble-t-il pas à un smiley? :>
minmaxavg

10

ZSH

>! filename

ZSH empêchera les utilisateurs d'empiler des fichiers à l'aide de l'opérateur de redirection io >. Si vous utilisez, >!vous pouvez forcer la troncature d'un fichier existant.

Si vous voulez que ZSH utilise le comportement de redirection de Bash, s'il n'y a pas de protection contre l'engorgement des fichiers, vous devez définir l' clobberoption pour votre shell.

Plus d'infos: http://zsh.sourceforge.net/Doc/Release/Redirection.html


8

SI vous voulez le faire depuis la ligne de commande d'un éditeur vim, essayez ceci:

vim file.txt 

Appuyez sur Esc.

:1,$d

Appuyez sur Enter.

Vous trouverez toutes les lignes supprimées.


Ceci est la seule chose qui a fonctionné pour mon maillog, même sudo > /var/log/maillogne serait pas effacer (permission refusée)
bobobobo

2
@bobobobo Cela ne fonctionne pas comme sudo > /var/log/maillogmoyen - lancez sudo et mettez sa sortie dans le fichier. De toute évidence, il met la sortie avec les autorisations de l'utilisateur actuel. Il est plus facile sudo sude démarrer shell racine puis de le faire > /var/log/maillog.
kan

4
$ rm file.log; touch file.log

ou

$ cat > file.log

suivi de control-d.

ou ... ou ... ou ...

Ah Voici une version à commande unique:

$ dd if=/dev/null of=file.log

2
La suggestion de Thechickenmoo echo "" > file.logest meilleure que l' catoption que vous montrez, dans cette situation, bien qu'il y en ait d'autres où il catest plus approprié. les deux utilisent la même redirection de shell pour effectuer le levage de charges lourdes.
Quack Quichotte

2
Vous n'avez pas besoin d'exécuter la commande cat. Juste "> fichier.log" le fera.
camh

Supprimer le fichier réinitialisera la date de création.
Matteo

Si vous supprimez le fichier, les programmes qui le regardent perdront leur pointeur (c’est-à-dire qu’il aura une nouvelle adresse dans le système de fichiers). De manière générale, oui rmaccomplira la tâche de produire un fichier vide portant le même nom. Mais ce ne sera pas juste pour chaque cas d'utilisation.
robert

4

La commande ci-dessous devrait également fonctionner:

cat /dev/null > file.log


1

Peu d'alternatives:

ex +%d -scwq file.log
cp /dev/null file.log
vi +%d -escwq file.log
install -m600 /dev/null file.log

1

Si vous avez des espaces dans les noms de fichiers, utilisez:

for file in /path/to/file/*; do > "$file"; done

(Je ne pouvais pas l'inclure dans les commentaires de la réponse précédente parce que je n'ai pas 50 ans de réputation. Parfois, les limitations sont contre-productives.)


0

Une ligne à la fois?

Essayez vi (m), le charmant éditeur de texte qui peut tout faire. Dans ce cas, accédez à une ligne, appuyez sur d (pour supprimer), puis à nouveau sur d (pour ligne).


5
Si vous souhaitez supprimer le fichier entier dans vim, avec le curseur en haut du document, tapez d G (c'est d, puis shift-G) pour supprimer le fichier entier (d pour supprimer, G pour fin du fichier). fichier). Je préfère cependant votre méthode (cela me laisse plus de temps pour réfléchir à la question de savoir si je veux VRAIMENT ou non détruire le fichier).
Babu

@Babu ggse déplace vers le haut pour que toute la séquence puisse être ggdG.
Bob

0

Avec mes autorisations, c'est la seule chose qui a fonctionné:

touch temp.txt
sudo mv temp.txt original-file.txt

0

De plus, si vous avez plusieurs fichiers, vous pouvez utiliser les éléments suivants:

for file in /path/to/file/*; do > $file; done

Ceci est utile pour les fichiers journaux dans le même répertoire.


0

> a.txt

Identique à> nom de fichier dans Bash, mais fonctionne dans plus de coques (crédit). Redirige la sortie du véritable construit (qui n'a pas de sortie) en nom de fichier.

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.