Как очистить содержимое файла из командной строки?


280

У меня есть файл журнала, в котором есть куча вещей, которые мне больше не нужны. Я хочу очистить содержимое.

Я знаю, как распечатать содержимое на экране:

cat file.log

Я знаю, как редактировать файл построчно:

nano file.log

Но я не хочу удалять каждую строку по одному. Есть ли способ сделать это в одной команде, не уничтожая файл, чтобы сделать это?

Ответы:


466

В Bash, просто

> filename

Сделаю.

Это оставит вас с пустым именем файла .

п.с.

Если вам нужно sudoпозвонить, пожалуйста, рассмотрите возможность использования truncateв соответствии с ответом здесь .


57
Это, вероятно, самая лучшая команда в истории вычислений
blarg

7
Напротив, @ Arekkusandaa.Irujasukin; он отлично работает в любой версии Windows, при условии, что, как уже упоминалось, вы используете в bashкачестве оболочки, а не, например, cmd.exeили PowerShell, ни того, ни другого не достаточно POSIXy, чтобы ожидать, чтобы справиться с такими вещами.
DopeGhoti

124

Вы можете использовать команду пользователя: truncate

truncate -s 0 test.txt

("-s 0", чтобы указать размер)

http://www.commandlinefu.com/commands/view/12/empty-a-file


3
Лучший ответ, работает, когда вы не root (с помощью sudo) - sudo echo > fileпросто выдает ошибку в таких случаях.
Дмитрий Верхотуров

12
@DmitryVerkhoturov: sudo bash -c '> filename'это то, как вы используете решения Bash с помощью sudo.
Стюарт П. Бентли,

1
brew install truncateна OS X с установленным доморощенным.
xaxxon

Работает быстрее, чем эхо
Miao1007

34

Вы могли бы сделать это:

echo -n "" > file.log

Используется >для записи (нулевого) ввода echo -nв файл.

Используя >>бы добавить нулевой вклад в файл (фактически , ничего не делая , но touchИНГ его).


Это оставит место там.
dmckee

Я получаю это: -bash:: команда не найдена
Эндрю

3
echo ""> все равно выдаст вам файл с одним символом (символ новой строки.) Если вы хотите использовать echo, используйте "echo -n> file.log" для вывода null.
Дейв Форгач

Было бы лучше использовать выделенную команду вывода на ноль, например true(или ее встроенный псевдоним :), хотя в конечном итоге вам вообще не нужна команда (см. Принятый ответ).
Стюарт П. Бентли

У вас могут быть проблемы с sudo.
лепешка

27
: > file.log

То же, что и > filenameв Bash, но работает в большем количестве оболочек (кредит) . Перенаправляет вывод из trueвстроенного (который не имеет вывода) в filename.


Я пришел, чтобы сделать этот ответ, но, увы, он уже здесь ... Возьми голос.
Аарон Холл,

5
Просто делай :> filename. Разве это не похоже на смайлик? :>
minmaxavg

10

ЗШ

>! filename

ZSH защитит пользователей от клобинга файлов с помощью оператора перенаправления io >. Если вы используете, >!вы можете форсировать существующий файл.

Если вы хотите, чтобы ZSH использовал поведение перенаправления Bash, если защита от перехвата файлов отсутствует, вам нужно установить clobberпараметр для вашей оболочки.

Дополнительная информация: http://zsh.sourceforge.net/Doc/Release/Redirection.html


8

Если вы хотите сделать это из редактора vim в командной строке, вы можете попробовать это:

vim file.txt 

Нажмите Esc.

:1,$d

Нажмите Enter.

Вы найдете все строки удалены.


Это единственное, что сработало для меня maillog, даже sudo > /var/log/maillogне
очистило

2
@bobobobo Это не работает как sudo > /var/log/maillogсредство - запустите sudo и поместите его вывод в файл. Очевидно, он выводит данные с разрешениями текущего пользователя. Проще сделать, sudo suзапустить корневую оболочку, а затем сделать > /var/log/maillog.
Кан

4
$ rm file.log; touch file.log

или же

$ cat > file.log

с последующим control-d.

или ... или ... или ...

Ах. Вот версия одной команды:

$ dd if=/dev/null of=file.log

2
Предложение The ChickenMoo echo "" > file.logлучше, чем catвариант, который вы показываете, в этой ситуации есть другие, которые catболее уместны. оба используют одинаковое перенаправление оболочки для выполнения тяжелой работы.
шарлатан-кихот

2
Вам не нужно запускать команду cat. Просто "> file.log" сделает это.
Camh

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

Удаление файла приведет к тому, что программы, наблюдающие за этим файлом, потеряют свой указатель на него (т. Е. У него будет новый адрес в файловой системе). В общем случае yes rmвыполнит задачу создания пустого файла с тем же именем. Но это не будет правильным для каждого варианта использования.
Роберт


2

Если для доступа к файлу вам нужны права sudo to superuser, то принятый ответ не будет работать. Используя это работает:

truncate -s0 file

или явно с помощью sudo:

sudo truncate -s0 file

Более подробная информация здесь http://www.commandlinefu.com/commands/view/12/empty-a-file


1

Несколько альтернатив:

ex +%d -scwq file.log
cp /dev/null file.log
vi +%d -escwq file.log
install -m600 /dev/null file.log

1

Если у вас есть пробелы в именах файлов, используйте:

for file in /path/to/file/*; do > "$file"; done

(Я не мог включить это в комментарии к предыдущему ответу, потому что у меня нет 50 репутации. Иногда ограничения являются контрпродуктивными.)


0

Одна строка за раз?

Попробуйте vi (m), прекрасный текстовый редактор, который может делать все что угодно. В этом случае перейдите к строке, нажмите d (для удаления) и снова d (для строки).


5
Если вы хотите избавиться от всего файла в vim, с курсором в верхней части документа, набрав d G (это d, затем shift-G), вы удалите весь файл (d для удаления, G для конца файл). Я предпочитаю ваш метод, хотя (это дает мне больше времени, чтобы подумать, действительно ли я хочу уничтожить файл).
Бабу

@Babu ggдвижется к вершине, так что вся последовательность может быть ggdG.
Боб

0

С моими разрешениями это единственное, что сработало:

touch temp.txt
sudo mv temp.txt original-file.txt

0

Кроме того, если у вас есть несколько файлов, вы можете использовать следующее:

for file in /path/to/file/*; do > $file; done

Это полезно для файлов журнала в том же каталоге.


0

> a.txt

То же, что и> имя файла в Bash, но работает в большем количестве оболочек (кредит). Перенаправляет вывод из встроенной функции true (которая не имеет вывода) в имя файла.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.