Cea mai eficientă metodă de a goli conținutul unui fișier (Unix, Script Shell, Fișiere, Trunchiați)

debal a intrebat.

Cunosc trei metode pentru a șterge toate intrările dintr-un fișier.

Acestea sunt

  • >filename
  • touch filename1
  • filename < /dev/null

Dintre aceste trei metode, eu abuzez de >filename cel mai mult, deoarece necesită cel mai mic număr de apăsări de taste.

Cu toate acestea, aș dori să știu care este cea mai eficientă dintre cele trei (dacă există metode mai eficiente) în ceea ce privește fișierele jurnal mari și fișierele mici.

De asemenea, cum operează cele trei coduri și cum șterg conținutul?


1Editați: așa cum s-a discutat în acest răspuns, acest lucru este de fapt nu șterge fișierul!

Comentarii

    30

  • Ce se întâmplă cu truncate -s 0 filename? –  > Por Martin Thoma.
  • Foarte asemănător cu Diferența dintre cat și ‘>’ pentru a anula un fișier în care veți găsi mai multe informații. –  > Por Stéphane Chazelas.
  • Primul va funcționa doar dacă este apelat din linia de comandă bash, dar nu va funcționa dacă este executat într-un fișier .sh –  > Por Marco Marsala.
  • touch nu șterge conținutul, dar modifică timpul de acces la fișier. Aceasta face creează un fișier gol dacă nu exista unul. –  > Por hbogert.
3 răspunsuri
ash

De fapt, a doua formă touch filename nu șterge nimic din fișier – creează doar un fișier gol dacă nu exista unul sau actualizează data ultimei modificări a unui fișier existent.

Iar al treilea filename < /dev/null încearcă să ruleze numele fișierului cu /dev/null ca intrare.

cp /dev/null filename funcționează.

În ceea ce privește eficiența, cea mai eficientă ar fi truncate -s 0 filename (a se vedea aici).

În caz contrar, cp /dev/null filename sau > filename sunt ambele bune. Ambele deschid și apoi închid fișierul, utilizând setarea truncate-on-open. cp de asemenea, deschide /dev/null, , ceea ce îl face puțin mai lent.

Pe de altă parte, truncate ar fi probabil mai lent decât > filename atunci când este rulat dintr-un script, deoarece rularea comenzii truncate necesită ca sistemul să deschidă executabilul, să îl încarce și apoi să îl ruleze.

Comentarii

  • Deci, de ce spuneți că truncate este cea mai eficientă? –  > Por Stéphane Chazelas.
  • Operațiunea de trunchiere utilizează apelul de sistem ftruncate() sau truncate(), care nu se obosește să deschidă fișierul. De asemenea, se evită apelul de sistem close() pe care cp și > filename trebuie să apeleze. –  > Por ash.
  • De fapt, acesta (cel puțin cel de la GNU) face o operațiune de deschidere+ftruncate+închidere (pe lângă numeroasele apeluri de sistem pe care le face pentru a se încărca și a se inițializa), deoarece oricum ar trebui să creeze fișierul dacă acesta nu există, iar truncate(2) nu face acest lucru. –  > Por Stéphane Chazelas.
  • Dacă folosim touch filename, , inodul va rămâne același (cu condiția să fi existat un fișier înainte)? –  > Por pMan.
  • @pMan da, puteți încerca și verifica cu ls -i –  > Por terdon.
Arturo Herrero

O altă opțiune ar putea fi:

echo -n > filename

Din pagina de manual a echo:

-n Do not print the trailing newline character.

Comentarii

  • Cum pot seta dimensiunea? Să zicem dacă vreau 30000 de caractere nule? –  > Por Utilizator.
Mirko Steiner

Există o comandă încorporată „:”, care este disponibilă în sh,csh,bash și poate și în altele, care poate fi folosită cu ușurință cu operatorul de redirecționare a ieșirii > trunchiați un fișier:

#!/usr/bin/env bash
:> filename

Ceea ce îmi place este că nu are nevoie de comenzi externe precum „echo” etc.

Un mare avantaj al trunchierii fișierelor în loc de ștergerea/recrearea lor este acela că rularea aplicațiilor care lucrează cu acest fișier (de exemplu, dacă cineva face un fișier de tip tail -f filename sau un software de monitorizare, …) nu trebuie să îl redeschidă. Ele pot continua să folosească în continuare descriptorul de fișier și primesc toate datele noi.

Comentarii

  • man bash descrie : shell builtin ca neavând niciun efect. –  > Por Haxiel.
  • Da, și redirecționați acest lucru cu > în fișier, care creează fișierul dacă nu există, iar dacă există, îl trunchiați la zero. Mai bine spus: se folosește : pentru a nu face nimic, și folosești > pentru a redirecționa nimic către un fișier, și îl trunchiați. –  > Por Mirko Steiner.
  • De ce ați face asta? > file este suficient pentru a trunchia un fișier. Nu aveți nevoie de nicio comandă, ci doar de operatorul de redirecționare. –  > Por terdon.
  • uneori, > filename nu va funcționa. de exemplu, în zsh. dar : > filename funcționează totuși. –  > Por CS Pei.
  • Bash și sh pare să le placă > myfile dar, de exemplu, csh dă erori cu: Invalid null command. –  > Por Mirko Steiner.