Очистить содержимое файла

220

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

Они есть

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

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

Тем не менее, я хотел бы знать, какой из трех наиболее эффективных методов (если есть какие-либо более эффективные) применяется в отношении больших файлов журналов и небольших файлов.

Кроме того, как три кода работают и удаляют содержимое?

Debal
источник
24
Как насчет truncate -s 0 filename?
Мартин Тома
Очень похоже на разницу между cat и '>', чтобы обнулить файл, в котором вы найдете больше информации.
Стефан Шазелас
Первый будет работать, только если вызывается из командной строки bash, но не будет работать, если выполняется в файле .sh
Marco Marsala
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при запуске из скрипта, так как для запуска команды truncate требуется, чтобы система открыла исполняемый файл, загрузила его и запустила.

ясень
источник
9
Так почему вы говорите, что truncateэто самый эффективный?
Стефан Шазелас
7
Операция truncate использует системный вызов ftruncate () или truncate (), который не мешает открыть файл. Это также позволяет избежать системного вызова close (), который должен вызывать cp и > filenameметоды.
пепел
3
На самом деле, он (по крайней мере, GNU) выполняет open + ftruncate + close (в дополнение ко многим системным вызовам, которые он выполняет для загрузки и инициализации себя), поскольку в любом случае ему придется создать файл, если он не существует. и truncate(2)не делает этого.
Стефан Шазелас
Если мы используем touch filename, останется ли индекс неизменным (при условии, что ранее был файл)?
13
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

Что мне нравится в этом, так это то, что ему не нужны никакие внешние команды, такие как «echo» и т. Д.

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

Мирко Штайнер
источник
man bashописывает :встроенную оболочку как не имеющую эффекта.
Хаксиэль
Да, и вы перенаправляете это с помощью >in в файл, который создает файл, если он не существует, и, если он существует, вы усекаете его до нуля. Лучше сказать: вы используете, :чтобы ничего не делать, и использовать, >чтобы ничего не перенаправлять в файл, и обрезать его.
Мирко Штайнер
1
Почему ты бы так поступил? > fileдостаточно, чтобы обрезать файл. Вам не нужна никакая команда, только оператор перенаправления.
Terdon
1
иногда > filenameне сработает. например, в зш. но : > filenameработает до сих пор.
CS Pei
Кажется, что bash и sh нравятся, > myfileно, например, csh error with: Invalid null command.
Мирко Штайнер