Comment vider («tronquer») un fichier sous Linux qui existe déjà et qui est protégé d'une manière ou d'une autre?

113

J'ai un fichier appelé error.log sur mon serveur que je dois fréquemment tronquer. J'ai les autorisations rw pour le fichier. Ouverture du fichier dans vi> suppression de tout le contenu> sauvegarde des travaux (évidemment). Mais quand j'essaye le dessous

cat /dev/null > error.log

Je reçois le message

File already exists.

De toute évidence, il existe une sorte de configuration effectuée sur le serveur pour éviter le remplacement accidentel des fichiers. Quelqu'un peut-il dire comment "tronquer" le fichier en une seule commande?

Sumeet Pareek
la source
2
Pour un fichier non protégé, tronquer le fichier -s 0 fonctionne.
Pramod

Réponses:

158

Vous avez le noclobberjeu d'options. L'erreur semble provenir de csh, vous feriez donc:

cat /dev/null >! file

Si je me trompe et que vous utilisez bash, vous devriez faire:

cat /dev/null >| file

dans bash, vous pouvez également raccourcir cela pour:

>| file
R Samuel Klatchko
la source
vous avez raison sur le shell csh. Comment saviez-vous que?
Sumeet Pareek
6
@Wikidkaka - basé sur le message d'erreur. csh sur mon système donne l' File existserreur similaire tandis que bash donne l' cannot overwrite existing fileerreur très différente .
R Samuel Klatchko
6
@Jarmund - parce que l'utilisateur n'a pas défini, >filene fonctionne pas.
R Samuel Klatchko
Quelle est la différence entre > fileet >| file?
Will
1
@Will - si vous avez noclobberdéfini l' option, la tentative de redirection vers un fichier existant échoue. Pour remplacer la redirection spécifique tout en laissant noclobber activé, vous pouvez utiliser>|
R Samuel Klatchko
71

Vous pouvez également utiliser la fonction tronquer

$truncate -s0 yourfile

si l'autorisation est refusée, utilisez sudo

$sudo truncate -s0 yourfile

Aide / Manuel: homme tronqué

testé sur ubuntu Linux

risnandar
la source
1
truncate touche également l'heure de modification du fichier - tandis que "> file" ne touche pas si le fichier est inchangé.
dsteinkopf
Il ne libère pas l'espace disque que contient le fichier. Au début, il montre les 0 octets. Mais lorsque vous écrivez quelque chose dans ce fichier, la taille du fichier est = avant tronquer + nouvelle taille de données.
Aniket Kulkarni
48

Ce sera suffisant pour définir la taille du fichier sur 0:

> error.log
SIFE
la source
6
en fait, cela ne fonctionne pas avec noclobber (je l'ai testé moi-même), donc ce n'est PAS une solution valide dans ce cas ("-bash: error.log: ne peut pas écraser le fichier existant"); voir commend ci-dessus ("@Jarmund - parce que l'utilisateur n'a pas de set,> le fichier ne fonctionne pas."). Je me demande simplement quel genre de "personnes intelligentes" votent manifestement de fausses réponses comme celle-ci ...
9

le mérite revient à mon collègue principal pour ceci:

:> filename

Cela ne cassera pas les fichiers journaux, vous pouvez donc même l'utiliser sur syslog, par exemple.

petermolnar
la source
8
S'il vous plaît, expliquez. Comment ça marche? Que fait cette notation?
user31986
2
@ user31986 :est une commande sans effet (presque un commentaire), puis >est la redirection comme d'habitude, donc cela ne fait que rediriger le manque de sortie d'une commande qui ne fait rien dans le fichier. Si noclobber est activé, vous avez besoin de :>| filename(bash) (et je suppose que :>! filenamedans csh en supposant que csh a :).
Rhubbarb
4

false | fichier teeToTruncate

peut fonctionner aussi bien

Dodger Web
la source
C'est juste idiot. Ou si cela est utile, obtenir obscurément ddrien ne serait encore mieux que le clair lisible false?
tripleee
2

Puisque sudo ne fonctionnera pas avec la redirection > , j'aime la teecommande à cet effet

echo "" | sudo tee fileName
sakhunzai
la source
Eh bien, en fait, c'est le cas, comme décrit à la fois dans la question que vous avez liée et ci-dessus. "sudo sh -c '> error.log'" ...
cela dépend des autorisations sur le fichier cible error.log, si cela est déjà accessible en écriture, il n'est pas nécessaire de sudo. Je pense que l'autre problème est que vous passez la commande en tant qu'argument de chaîne à sh, je ne sais pas comment cela est géré en interne mais c'est une autre couche de complexité / redirection ajoutée
sakhunzai
1
Cela ne tronquera pas réellement le fichier, car echo ""cela ajoutera une nouvelle ligne. Vous pouvez utiliser echo -n ""pour supprimer la nouvelle ligne
Seb
0

N'importe qui peut essayer cette commande pour tronquer n'importe quel fichier dans le système Linux

Cela fonctionnera sûrement dans n'importe quel format:

truncate -s 0 file.txt
user3301460
la source
0

J'aime ça: cp /dev/null file

Den129
la source
-4

Vous pouvez également essayer:

echo -n > /my/file

Oden
la source
8
Vous voyez la réponse avec une tonne de votes? Essayez de le lire, regardez en haut noclobber, puis demandez-vous si votre réponse a du sens.