Svuotare il contenuto di un file di testo


16

Ho un file di testo nella mia directory home che riceve regolarmente dati attraverso un processo cron. Poiché il processo cron fornisce dati dinamici, vorrei anche impostare un processo cron per svuotare il contenuto del file (il file deve ancora esistere). Non ho bisogno di aiuto con cron, solo il comando che può aiutare a svuotare il file.


5
Alternativa: tail -n +1000 file.txt > file.txtrimuovere 1000 righe e conservare le righe più recenti nel file (non si sa mai quando potrebbe essere necessario un po 'del record recente per tenere traccia di qualcosa).
Rinzwind,

2
Questa è in realtà un'opzione migliore rispetto alla cancellazione del file negli orari pianificati.
Bruno Pereira,

1
@Rinzwind, che non funzionerà poiché il file verrà troncato prima che tail provi a leggerlo. È necessario reindirizzare a un nuovo file, quindi sostituire l'originale con quello nuovo.
psusi,

Vero @psusi :) ci deve essere un reindirizzamento extra lì.
Rinzwind,

Risposte:


28

Il modo più semplice:

> filename

Questo è un modo meno ovvio e probabilmente meno leggibile in uno script di shell da altri, ma è tutto ciò di cui hai bisogno.

Perché in >realtà non è un vero comando (è bash builtin) non puoi usare:

sudo > filename

quando non si dispone delle autorizzazioni per quel file. Ma puoi usare:

sudo bash -c "> filename"

che tipo di autorizzazioni devono essere modificate perché dice che è stata negata l'autorizzazione, ho già inviato chmod 755 al file o dovrei renderlo un nuovo post (intendo la domanda sulle autorizzazioni)
sosytee,

@sosytee Vedi le mie nuove modifiche.
Radu Rădeanu,

1
@sosytee Certo che puoi, ma usa sudo crontab -eper aggiungere il cron job per root, non per te. O cambiare il permesso di file a 766 (o 666), per non 755: sudo chmod 766 filename. Maggiori informazioni su: codex.wordpress.org/Changing_File_Permissions
Radu Rădeanu,

1
truncate filenameè un po 'più pulito e più semplice rispetto al reindirizzamento di un output vuoto sul file e non presenta problemi sudo.
psusi,

1
@psusi truncate -s 0 filenamepuò davvero fare il trucco. Puoi aggiungerlo come risposta.
Radu Rădeanu,

19

Esiste uno strumento creato a tale scopo:

truncate -s 0 filename

Questo cancellerà il contenuto ma rimarrà lo stesso file (l' inode rimane lo stesso).

Questo è importante perché alcuni programmi contengono un handle per il file "per inode". Supponiamo di "svuotare" un file usando il metodo ingenuo di eliminare e ricreare il file. Alcuni programmi potrebbero comunque contenere un handle per il vecchio file (con il vecchio contenuto) anche se non è più visibile come al solito ls.

Alcuni link a maggiori dettagli alla fine di questa risposta.


Un altro modo, forse più facile da ricordare:

echo -n > filename

Ciò mantiene anche lo stesso inode.

Si noti che entrambi truncatee echo -nnon sono definiti da POSIX .

Per la conformità POSIX utilizzare cat /dev/null:

cat /dev/null > filename

Ancora un altro modo, più oscuro e probabilmente non shell agnostico:

> filename

Se il file da troncare necessita dei privilegi di root per scrivere, le seguenti righe non funzioneranno come probabilmente previsto:

sudo echo -n > filename
sudo cat /dev/null > filename
sudo > filename

Questo perché il reindirizzamento viene eseguito dalla shell anche prima dell'esecuzione di sudo. Ciò significa che l'accesso in scrittura al file viene effettuato utilizzando i privilegi dell'utente che esegue la shell, non i privilegi che saranno concessi da sudo.

Una soluzione alternativa consiste nel rinviare il reindirizzamento a una shell eseguita utilizzando i privilegi di sudo in questo modo:

sudo sh -c "echo -n > filename"

L'utilizzo truncatedi questa soluzione non è necessario in quanto l'accesso in scrittura non viene eseguito dalla shell ma mediante il truncatequale viene eseguito da sudo utilizzando i privilegi di sudo.

sudo truncate -s 0 filename

Per alcuni dettagli cruenti sui programmi che tengono aperto il file anche se il file è stato eliminato, puoi leggere quanto segue:


dice Autorizzazione negata, hanno usato chmod 755 nomefile ma l'autorizzazione è ancora negata
sosytee

2
forse hai noclobber abilitato in bash?
lesmana,

La risposta più completa finora
AbdelHady,

4

Per automatizzare questo è possibile utilizzare logrotate. Basta creare un file di configurazione per il file che si desidera svuotare, aggiungere altre impostazioni e puoi averlo vuoto ogni giorno automaticamente in base ai criteri scelti ogni giorno o quando il file è più grande di ecc.

Dai un'occhiata qui su come configurare logrotate: http://linuxcommand.org/man_pages/logrotate8.html


1
Personalmente, preferisco questa opzione. Usiamo "file> 10 Mb" -> "tar.gz per eseguire il backup" "file vuoto". E i backup vengono eliminati dopo 900 giorni.
Rinzwind,

3

echo "" > foo_fileè un modo semplice per farlo, sostituirà tutti i contenuti di foo_file con "" rendendolo vuoto, in questo caso.

Puoi anche usare cat /dev/null > foo_file, che leggerà il dispositivo null e sovrascriverà il tuo file senza nulla.


dice Autorizzazione negata, hanno usato chmod 755 nomefile ma l'autorizzazione è ancora negata
sosytee

Puoi leggere le autorizzazioni dei file con il tuo normale utente, per favore?
Bruno Pereira,

Sì, posso leggere il contenuto come utente normale
sosytee,
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.