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?

Andrew
la source

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 .

geek
la source
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

non non
la source
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 ).

Thechickenmoo
la source
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.

Stuart P. Bentley
la source
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

Brian Wigginton
la source
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.

le soum
la source
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
dmckee
la source
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
Paarth Batra
la source
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
Kenorb
la source
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.)

d491049
la source
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).

Phoshi
la source
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
Morgan
la source
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.

Domaines à l'honneur
la source
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.

utilisateur1021769
la source