Svuota il contenuto di un file


220

Sono a conoscenza di tre metodi per eliminare tutte le voci da un file.

Loro sono

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

Di questi tre abuso di >filenamepiù in quanto richiede il minor numero di tasti.

Tuttavia, vorrei sapere qual è il più efficiente dei tre (se esistono metodi più efficienti) rispetto ai file di registro di grandi dimensioni e ai file di piccole dimensioni.

Inoltre, come funzionano i tre codici ed eliminano i contenuti?


24
Che dire truncate -s 0 filename?
Martin Thoma,

Molto simile alla differenza tra cat e '>' per azzerare un file dove troverai maggiori informazioni.
Stéphane Chazelas,

Il primo funzionerà solo se chiamato dalla riga di comando bash, ma non funzionerà se eseguito in un file .sh
Marco Marsala

8
touch non elimina i contenuti, ma modifica i tempi di accesso al file. Lo fa creare un file vuoto, se non esisteva.
hbogert,

Risposte:


293

In realtà, il secondo modulo touch filenamenon elimina nulla dal file: crea un file vuoto solo se non esisteva o aggiorna la data dell'ultima modifica di un file esistente.

E il terzo filename < /dev/nulltenta di eseguire il nome file con /dev/nullcome input.

cp /dev/null filename lavori.

Per quanto riguarda l'efficienza, la più efficiente sarebbe truncate -s 0 filename; vedi qui: http://linux.die.net/man/1/truncate .

Altrimenti, cp /dev/null filenameo > filenamestanno entrambi bene. Entrambi aprono e quindi chiudono il file, usando l'impostazione truncate-on-open. cpsi apre anche /dev/null, in modo da renderlo leggermente più lento.

D'altra parte, truncatesarebbe probabilmente più lento rispetto a > filenamequando eseguito da uno script poiché l'esecuzione del comando truncate richiede che il sistema apra l'eseguibile, lo carichi e lo esegua.


9
Allora perché dici che truncateè il più efficiente?
Stéphane Chazelas,

7
L'operazione truncate utilizza la chiamata di sistema ftruncate () o truncate () che non si preoccupa di aprire il file. Evita anche la chiamata di sistema close () che cp e i > filenamemetodi devono chiamare.
ash

3
In realtà, (almeno quello GNU) fa un open + ftruncate + close (oltre alle molte chiamate di sistema che fa per caricare e inizializzare se stesso), come comunque dovrebbe creare il file se non esistesse e truncate(2)non lo fa.
Stéphane Chazelas,

Se usiamo touch filename, l'inode rimarrà lo stesso (a condizione che prima ci fosse un file)?
pMan,

1
@pMan sì, puoi provarlo e verificare conls -i
terdon

43

Un'altra opzione potrebbe essere:

echo -n > filename

Dalla pagina man di echo:

-n Do not print the trailing newline character.


Come posso impostare la dimensione? Dire se voglio 30000 caratteri null?
Utente

3

C'è un comando incorporato ":", che è disponibile in sh, csh, bash e altri forse, che può essere facilmente usato con l'operatore di reindirizzamento dell'output >troncando un file:

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

Quello che mi piace è che non necessita di comandi esterni come "echo" ecc.

Un grande vantaggio di troncare i file invece di eliminarli / ricrearli è che le applicazioni in esecuzione che funzionano con questo file (ad esempio qualcuno crea un tail -f filenamesoftware di monitoraggio o ...) non devono riaprirlo. Possono semplicemente continuare a utilizzare il filedescriptor e ottenere tutti i nuovi dati.


man bashdescrive la :shell incorporata come non avere alcun effetto.
Haxiel,

Sì, e lo reindirizzi con >dentro al file, che crea il file se non esiste e se esiste lo tronchi a zero. Meglio dire: si usa il :per non fare nulla, e si usa >per reindirizzare nulla a un file e troncarlo.
Mirko Steiner,

1
Perché dovresti farlo? > fileè sufficiente per troncare un file. Non è necessario alcun comando, solo l'operatore di reindirizzamento.
Terdon

1
a volte, > filenamenon funzionerà. per esempio, in zsh. ma : > filenamefunziona ancora.
CS Pei,

Bash e sh sembrano apprezzare, > myfilema ad esempio errori csh con: comando null non valido.
Mirko Steiner,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.