Come cancellare il contenuto di un file dalla riga di comando?


280

Ho un file di registro che contiene un sacco di cose che non mi servono più. Voglio cancellare il contenuto.

So come stampare i contenuti sullo schermo:

cat file.log

So come modificare il file, riga per riga:

nano file.log

Ma non voglio cancellare ogni riga una alla volta. C'è un modo per farlo in un solo comando senza distruggere il file per farlo?

Risposte:


466

In bash, giusto

> filename

andrà bene.

Questo ti lascerà con un nome file file vuoto .

ps

Se hai bisogno di sudochiamare, considera di utilizzare truncatela risposta qui .


57
Questo è probabilmente il comando più radicale nella storia dell'informatica
blarg

7
Al contrario, @ Arekkusandaa.Irujasukin; funziona benissimo in qualsiasi versione di Windows, purché, come detto, si stia utilizzando bashcome shell e non ad es. cmd.exeo PowerShell, nessuno dei quali è POSIX abbastanza da aspettarsi di gestire tali cose.
DopeGhoti,

124

È possibile utilizzare il comando utente: troncare

truncate -s 0 test.txt

("-s 0" per specificare la dimensione)

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


3
La migliore risposta in giro, funziona quando non sei root (con sudo) - sudo echo > filein questi casi dà solo un errore.
Dmitry Verkhoturov,

12
@DmitryVerkhoturov: sudo bash -c '> filename'è come usi le soluzioni Bash con sudo.
Stuart P. Bentley,

1
brew install truncatesu os x con homebrew installato.
xaxxon,

Funziona più velocemente dell'eco
Miao1007,

34

Potresti farlo:

echo -n "" > file.log

Utilizzo >per scrivere l'input (null) da echo -nnel file.

Utilizzando >>sarebbe aggiungere l'ingresso null per il file (in modo efficace non fare nulla, ma touching esso).


Questo lascerà uno spazio lì dentro.
dmckee,

Sto ottenendo questo: -bash:: comando non trovato
Andrew

3
echo ""> ti darà comunque un file con un carattere (una nuova riga.) Se vuoi usare echo, usa "echo -n> file.log" per echo null.
Dave Forgac,

Sarebbe meglio usare un comando null-output dedicato come true(o il suo alias incorporato :), anche se alla fine non hai bisogno di un comando (vedi la risposta accettata).
Stuart P. Bentley,

Potresti avere dei problemi con sudo.
Flapjack,

27
: > file.log

Come > filenamein Bash, ma funziona in più shell (credito) . Reindirizza l'output dall'integrato true(che non ha output) a filename.


Sono venuto per dare questa risposta, ma purtroppo è già qui ... Prendi un voto.
Aaron Hall il

5
Fallo e basta :> filename. Non sembra uno smiley? :>
minmaxavg

10

ZSH

>! filename

ZSH proteggerà gli utenti dai file di clobbering utilizzando l'operatore di reindirizzamento io >. Se lo usi >!puoi forzare il troncamento di un file esistente.

Se si desidera che ZSH utilizzi il comportamento di reindirizzamento di Bash, se non vi è alcuna protezione dall'archiviazione dei file, è necessario impostare l' clobberopzione per la shell.

Ulteriori informazioni: http://zsh.sourceforge.net/Doc/Release/Redirection.html


8

SE vuoi fare dall'interno di un editor VIM nella riga di comando, puoi provare questo:

vim file.txt 

Press Esc.

:1,$d

Press Enter.

Troverai tutte le righe cancellate.


Questa è l'unica cosa che ha funzionato per me maillog, anche sudo > /var/log/maillogse non l' avessi cancellato (permesso negato)
bobobobo

2
@bobobobo Non funziona come un sudo > /var/log/maillogmezzo: esegui sudo e inserisci il suo output nel file. Ovviamente mette l'output con le autorizzazioni dell'utente corrente. Cosa più semplice fare sudo suavviare root shell e poi fare > /var/log/maillog.
gennaio

4
$ rm file.log; touch file.log

o

$ cat > file.log

seguito da control-d.

o ... o ... o ...

Ah. Ecco una versione a comando singolo:

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

2
Il suggerimento di Thechickenmoo echo "" > file.logè migliore catdell'opzione che mostri, in questa situazione, anche se ce ne sono altri dove catè più appropriato. entrambi usano lo stesso reindirizzamento del guscio per eseguire il sollevamento pesante.
Quack Quixote

2
Non è necessario eseguire il comando cat. Solo "> file.log" lo farà.
Camh

La rimozione del file reimposterà la data di creazione.
Matteo,

Rimuovendo il file, i programmi che guardano quel file perderanno il loro puntatore (ad esempio, avrà un nuovo indirizzo nel filesystem). In generale, Sì rmeseguirà il compito di produrre un file vuoto con lo stesso nome. Ma non sarà giusto per ogni caso d'uso.
robert

4

Anche il comando seguente dovrebbe funzionare:

cat /dev/null > file.log


1

Poche alternative:

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

1

Se hai spazi nei nomi dei file, usa:

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

(Non ho potuto includerlo nei commenti alla risposta precedente perché non ho 50 reputazione. A volte le limitazioni sono controproducenti.)


0

Una riga alla volta?

Prova vi (m), il delizioso editor di testo che può fare qualsiasi cosa. In questo caso, spostarsi su una riga, premere d (per eliminare) e nuovamente d (per riga).


5
Se vuoi sbarazzarti di tutto il file in vim, con il cursore nella parte superiore del documento, digitando d G (che è d, quindi maiusc-G) cancellerai l'intero file (d per eliminare, G per la fine del file). Preferisco il tuo metodo, però (mi dà più tempo per pensare se VOGLIO VERAMENTE o meno il cestino).
Babu

@Babu si ggsposta in alto in modo che l'intera sequenza possa essere ggdG.
Bob

0

Con i miei permessi questa è l'unica cosa che ha funzionato:

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

0

Inoltre, se si dispone di più file è possibile utilizzare quanto segue:

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

Questo è utile per i file di registro nella stessa directory.


0

> a.txt

Come> nome file in Bash, ma funziona in più shell (credito). Reindirizza l'output dal vero builtin (che non ha output) al nome file.

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.