Come svuotare (“troncare”) un file su linux che già esiste ed è in qualche modo protetto?


113

Ho un file chiamato error.log sul mio server che devo troncare frequentemente. Ho i permessi rw per il file. Aprire il file in vi> eliminare tutto il contenuto> salvare i lavori (ovviamente). Ma quando provo il seguito

cat /dev/null > error.log

Ho ricevuto il messaggio

File already exists.

Ovviamente c'è una sorta di configurazione eseguita sul server per prevenire l'override accidentale dei file. Qualcuno può dire come faccio a "troncare" il file in un unico comando?


2
Per un file non protetto, troncare il file -s 0 funziona.
Pramod

Risposte:


158

Hai l' noclobberopzione impostata. L'errore sembra provenire da csh, quindi dovresti fare:

cat /dev/null >! file

Se mi sbaglio e stai usando bash, dovresti fare:

cat /dev/null >| file

in bash, puoi anche abbreviarlo a:

>| file

hai ragione sul fatto che la shell sia csh. Come lo sai?
Sumeet Pareek

6
@Wikidkaka - basato sul messaggio di errore. csh sul mio sistema dà l' File existserrore simile mentre bash dà l' cannot overwrite existing fileerrore molto diverso .
R Samuel Klatchko

6
@Jarmund - poiché l'utente ha impostato noclobber, >filenon funziona.
R Samuel Klatchko

Qual è la differenza tra > filee >| file?
Will

1
@ Will - se hai noclobberimpostato l' opzione, il tentativo di reindirizzare a un file esistente fallisce. Per ignorare il reindirizzamento specifico lasciando attivo noclobber, puoi utilizzare>|
R Samuel Klatchko

71

Puoi anche usare la funzione truncate

$truncate -s0 yourfile

se il permesso viene negato, usa sudo

$sudo truncate -s0 yourfile

Aiuto / Manuale: man truncate

testato su Ubuntu Linux


1
truncate tocca anche l'ora di modifica del file - mentre "> file" non tocca se il file è invariato.
dsteinkopf

Non rilascia lo spazio su disco contenuto nel file. All'inizio mostra gli 0 byte. Ma quando scrivi qualcosa su quel file, la dimensione del file è = before truncate + new data size.
Aniket Kulkarni

48

Questo sarà sufficiente per impostare la dimensione del file su 0:

> error.log

6
in realtà, questo non funziona con noclobber (l'ho testato io stesso), quindi NON è una soluzione valida in questo caso ("-bash: error.log: non può sovrascrivere il file esistente"); vedi encomio sopra ("@Jarmund - perché l'utente ha noclobber impostato,> file non funziona."). Mi chiedo solo che tipo di "persone intelligenti" votino a favore di risposte ovviamente sbagliate come questa ...

9

il merito va al mio collega senior per questo:

:> filename

Questo non interromperà i file di registro, quindi puoi persino usarlo su syslog, per esempio.


8
Spiega per favore. Come funziona? Cosa sta facendo quella notazione?
user31986

2
@ user31986 :è un comando senza effetto (quasi un commento), quindi >è il reindirizzamento come al solito, quindi questo reindirizza solo la mancanza di output da un comando che non fa nulla nel file. Se noclobber è abilitato, è necessario :>| filename(bash) (e presumo :>! filenamein csh assumendo che csh lo abbia :).
Rabarbaro

4

false | tee fileToTruncate

può funzionare anche


È solo sciocco. O se questo è utile, oscuramente arrivare ddall'output niente sarebbe persino meglio del semplice leggibile false?
tripleee

2

Poiché sudo non funzionerà con il reindirizzamento > , mi piace il teecomando per questo scopo

echo "" | sudo tee fileName

beh, in realtà lo fa, come descritto sia nella domanda che hai collegato che qui sopra. "sudo sh -c '> error.log'" ...

dipende dai permessi sul file di destinazione error.log, se questo è già scrivibile non è necessario sudo. Penso che l'altro problema sia che stai passando il comando come argomento stringa a sh, non so come venga gestito internamente ma questo è un altro livello di complessità / reindirizzamento aggiunto
sakhunzai

1
Questo in realtà non troncherà il file, perché echo ""aggiungerà una nuova riga. Puoi usare echo -n ""per sopprimere la nuova riga
Seb

0

Chiunque può provare questo comando per troncare qualsiasi file nel sistema Linux

Questo funzionerà sicuramente in qualsiasi formato:

truncate -s 0 file.txt


-4

Puoi provare anche:

echo -n > /my/file


8
Vedi la risposta con un sacco di voti? Prova a leggerlo, guarda in alto noclobbere poi chiediti se la tua risposta ha senso.
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.