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

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ИНГ его).

Thechickenmoo
источник
Это оставит место там.
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
dmckee
источник
2
Предложение The ChickenMoo echo "" > file.logлучше, чем catвариант, который вы показываете, в этой ситуации есть другие, которые catболее уместны. оба используют одинаковое перенаправление оболочки для выполнения тяжелой работы.
шарлатан-кихот
2
Вам не нужно запускать команду cat. Просто "> file.log" сделает это.
Camh
Удаление файла приведет к сбросу даты создания.
Маттео
Удаление файла приведет к тому, что программы, наблюдающие за этим файлом, потеряют свой указатель на него (т. Е. У него будет новый адрес в файловой системе). В общем случае yes rmвыполнит задачу создания пустого файла с тем же именем. Но это не будет правильным для каждого варианта использования.
Роберт
4

Ниже команда также должна работать:

cat /dev/null > file.log
Паарт Батра
источник
2

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

truncate -s0 file

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

sudo truncate -s0 file

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

timeSmith
источник
1

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

ex +%d -scwq file.log
cp /dev/null file.log
vi +%d -escwq file.log
install -m600 /dev/null file.log
kenorb
источник
1

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

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

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

d491049
источник
0

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

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

Phoshi
источник
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

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

DomainsFeatured
источник
0

> a.txt

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

user1021769
источник