Як очистити вміст файлу з командного рядка?


280

У мене є файл журналу, в якому є маса речей, які мені вже не потрібні. Я хочу очистити вміст.

Я знаю, як надрукувати вміст на екран:

cat file.log

Я знаю, як редагувати файл по черзі:

nano file.log

Але я не хочу видаляти кожний рядок по одному. Чи є спосіб зробити це в одній команді, не знищуючи файл, щоб це зробити?

Відповіді:


465

В баш, просто

> filename

зроблю.

Це дозволить вам залишити порожнє ім’я файлу .

пс

Якщо вам потрібно sudoзателефонувати, будь ласка , розглянути можливість використання в truncateякості відповів тут .


57
Це, мабуть, найдешевша команда в історії обчислень
blarg

7
Навпаки, @ Arekkusandaa.Irujasukin; вона працює чудово у будь-якій версії Windows, доки, як згадувалося, ви використовуєте bashв якості оболонки, а не, наприклад, cmd.exePowerShell, жодна з яких не є POSIXy достатньою, щоб очікувати, щоб обробляти такі речі.
DopeGhoti

124

Ви можете використовувати команду користувача: усікати

truncate -s 0 test.txt

("-s 0", щоб вказати розмір)

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


3
Найкраща відповідь, яка працює, коли ти не є кореневим (із судо) - sudo echo > fileпросто в таких випадках помилка.
Дмитро Верхотуров

12
@DmitryVerkhoturov: sudo bash -c '> filename'це те, як ти використовуєш рішення Bash із судо.
Стюарт П. Бентлі

1
brew install truncateна OS x із встановленою домашньою мовою.
xaxxon

Працює швидше, ніж відлуння
Miao1007

34

Ви можете зробити це:

echo -n "" > file.log

Використовуючи >для запису (null) вхід з echo -nу файл.

Використовуючи >>б додати нульовий внесок в файл (фактично , нічого не роблячи , але touchІНГ його).


Це залишить місце там.
dmckee

Я отримую це: -bash:: команда не знайдена
Андрій

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

Було б краще використовувати спеціальну команду null-output на зразок true(або її вбудований псевдонім :), хоча в кінцевому підсумку вам взагалі не потрібна команда (див. Прийняту відповідь).
Стюарт П. Бентлі

У вас можуть виникнути проблеми sudo.
flapjack

27
: > file.log

Те саме, що > filenameв Bash, але працює в більшості оболонок (кредит) . Перенаправляє вихід з trueвбудованого (який не має виходу) на filename.


Я прийшов зробити цю відповідь, але на жаль, це вже тут ... Візьміть підсумки.
Аарон Холл

5
Просто роби :> filename. Це не схоже на смайлик? :>
minmaxavg

10

ЗШ

>! filename

ЗШ захищатиме користувачів від затирання файлів з допомогою оператора перенаправлення вводу - виводу >. Якщо ви використовуєте, >!ви можете змусити усікати існуючий файл.

Якщо ви хочете, щоб ZSH використовувала поведінку перенаправлення Баша, чи не було захисту від клобінгу файлів, тоді вам потрібно встановити 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
Пропозиція Thechickenmoo echo "" > file.logкраще, ніж catваріант, який ви показуєте, в цій ситуації є інші, де catє більш підходящим. обидва використовують одне й те саме перенаправлення снарядів для важкого підйому.
хитаючий кіхот

2
Вам не потрібно запускати команду cat. Просто "> file.log" це зробить.
camh

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

Видалення файлу призведе до того, що програми, що переглядають цей файл, втрачають свій вказівник на нього (тобто він матиме нову адресу у файловій системі). Взагалі, так, rmце виконає завдання створити порожній файл з тим самим іменем. Але це не буде правильним для кожного випадку використання.
Роберт



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, але працює в більшості оболонок (кредит). Перенаправляє вихід з справжнього вбудованого (який не має виходу) на ім'я файлу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.