Очистіть вміст файлу


220

Мені відомо три способи видалення всіх записів з файлу.

Вони є

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

З цих трьох я зловживаю >filenameнайбільше, оскільки для цього потрібна найменша кількість натискань клавіш.

Однак я хотів би знати, який найбільш ефективний із цих трьох (якщо є якісь більш ефективні методи) щодо великих журналів і малих файлів.

Крім того, як три коди діють та видаляють вміст?


24
Про що truncate -s 0 filename?
Мартін Тома

Дуже схожа на різницю між cat і '>', щоб зняти нуль з файлу, де ви знайдете більше інформації.
Стефан Шазелас

Перший працюватиме лише у випадку, якщо викликається з командного рядка bash, але не працюватиме, якщо він буде виконаний у файлі .sh
Марко Марсала

8
touch не видаляє вміст, але змінює час доступу до файлу. Він створює порожній файл, якщо жодного не існувало.
hbogert

Відповіді:


293

Насправді друга форма touch filenameнічого не видаляє з файлу - вона створює лише порожній файл, якщо такого не існувало, або оновлює останню змінену дату існуючого файлу.

І третя filename < /dev/nullнамагається запустити ім'я файлу з /dev/nullвведенням.

cp /dev/null filename працює.

Щодо ефективного, найефективнішим було б truncate -s 0 filename; дивіться тут: http://linux.die.net/man/1/truncate .

В іншому випадку cp /dev/null filenameабо > filenameобидва штрафу. Вони обидва відкривають, а потім закривають файл, використовуючи налаштування усікання-відкривання. cpтакож відкривається /dev/null, так що робить це незначно повільніше.

З іншого боку, truncateце, швидше за все, буде повільніше, ніж > filenameпри запуску зі скрипту, оскільки виконання команди усікання вимагає від системи відкрити виконуваний файл, завантажити його та запустити його.


9
То чому ти кажеш, що truncateце найефективніше?
Стефан Шазелас

7
Операція обрізання використовує системний виклик ftruncate () або усікання (), який не намагається відкрити файл. Це також дозволяє уникнути закриття () системного виклику, на який > filenameпотрібно викликати cp та методи.
попіл

3
Насправді, він (принаймні GNU) робить відкритим + ftruncate + close (крім багатьох системних викликів, які він завантажує та ініціалізує), як би в будь-якому випадку, він мав би створити файл, якщо його не існувало і truncate(2)не робить цього.
Стефан Шазелас

Якщо ми використовуємо touch filename, чи буде inode залишатися однаковим (за умови, що раніше був файл)?
pMan

1
@pMan так, ви можете спробувати і перевіритиls -i
terdon

43

Іншим варіантом може бути:

echo -n > filename

З чоловічої сторінки echo:

-n Do not print the trailing newline character.


Як я можу встановити розмір? Скажіть, чи хочу я 30000 нульових символів?
Користувач

3

Існує вбудована команда ":", яка доступна в sh, csh, bash та інших, можливо, яка може бути легко використана разом із >усіма файлами оператора перенаправлення виводу :

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

Мені подобається, що для цього не потрібні зовнішні команди, такі як "ехо" тощо.

Однією з головних переваг обрізання файлів замість видалення / відтворення їх є те, що запущені програми, які працюють з цим файлом (наприклад, хтось робить tail -f filenameпрограмне забезпечення для моніторингу, ...) не повинні його знову відкривати. Вони просто можуть продовжувати використовувати fileescriptor і отримувати всі нові дані.


man bashописує :вбудовану оболонку як таку, що не має ефекту.
Хаксіель

Так, і ви перенаправляєте це >у файл, який створює файл, якщо його не існує, і якщо він існує, ви усікаєте його до нуля. Краще кажучи: ви не використовуєте :нічого, і використовуєте >для того, щоб нічого не перенаправляти до файлу та усікати його.
Мірко Штейнер

1
Навіщо ти це робив? > fileдостатньо для врізання файлу. Вам не потрібна жодна команда, лише оператор перенаправлення.
тердон

1
іноді, > filenameне вийде. наприклад, в zsh. але : > filenameпрацює як і раніше.
CS Pei

Bash і sh, схоже, люблять, > myfileале, наприклад, csh помилки з: Недійсна команда null.
Мірко Штейнер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.