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.