コマンドラインからファイルの内容を消去する方法は?


280

ログファイルには、不要なものがたくさんあります。内容をクリアしたいです。

コンテンツを画面に印刷する方法を知っています:

cat file.log

ファイルを1行ずつ編集する方法を知っています。

nano file.log

ただし、各行を一度に1つずつ削除する必要はありません。ファイルを破壊せずに1つのコマンドで実行する方法はありますか?

回答:


465

バッシュでは、ちょうど

> filename

しましょう。

これにより、空のファイルfilenameが残ります

PS

sudo電話が必要な場合は、こちらの回答truncateに従って使用することを検討してください。


57
これはおそらく、コンピューティングの歴史の中でraddestコマンドです
blarg

7
それどころか、@ Arekkusandaa.Irujasukin; 前述のように、bashシェルcmd.exeやPowerShell などではなく、シェルとして使用している限り、どちらのバージョンでも問題なく動作します。
-DopeGhoti

124

ユーザーコマンドを使用できます:truncate

truncate -s 0 test.txt

(サイズを指定するには「-s 0」)

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


3
最適な答えは、非ルート(sudoを使用)のときに機能しますsudo echo > file。そのような場合はエラーを返します。
ドミトリーヴェルホトゥロフ

12
@DmitryVerkhoturov:sudo bash -c '> filename'sudoでBashソリューションを使用する方法です。
スチュアートP.ベントレー

1
brew install truncatehomebrewがインストールされたOS X上。
xaxxon

エコーよりも高速に
動作する-Miao1007

34

これを行うことができます:

echo -n "" > file.log

を使用>して、(null)入力をecho -nファイルに書き込みます。

を使用>>すると、null入力がファイルに追加されます(事実上、それ以外は何もしませんtouch)。


これにより、そこにスペースが残ります。
dmckee

私はこれを得ています:-bash::コマンドが見つかりません
アンドリュー

3
echo "">は、1文字のファイル(改行)を提供します。エコーを使用する場合は、 "echo -n> file.log"を使用してnullをエコーし​​ます。
デイブフォーガック

最終的にはまったくコマンドを必要としませんが、true(またはその組み込みエイリアス:)のような専用のヌル出力コマンドを使用する方が良いでしょう(受け入れられた答えを参照)。
スチュアートP.ベントレー14

にいくつか問題があるかもしれませんsudo
フラップジャック

27
: > file.log

> filenameBashと同じですが、より多くのシェルで動作します(クレジット)true組み込み(出力がない)からの出力をにリダイレクトしますfilename


私はこの答えをするようになりましたが、悲しいかなそれはすでにここにあります...賛成票を取ります。
アーロンホール14

5
ただやる:> filename。スマイリーのように見えませんか?:>
minmaxavg

10

ZSH

>! 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(許可拒否)、それをクリアしないでしょう
bobobobo

2
@boboboboそれはsudo > /var/log/maillog手段として機能しません-sudoを実行し、その出力をファイルに入れます。明らかに、現在のユーザー権限で出力を配置します。より簡単なことはsudo su、ルートシェルを起動してから実行することです> /var/log/maillog
kan 14年

4
$ rm file.log; touch file.log

または

$ cat > file.log

が続きcontrol-dます。

または...または...または...

あ。単一のコマンドバージョンを次に示します。

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

2
Thechickenmooの提案はecho "" > file.logcatあなたが示すオプションよりも優れています。この状況でcatは、より適切な他のものがあります。両方とも同じシェルリダイレクトを使用して、重い持ち上げを行います。
いんちきキホーテ

2
catコマンドを実行する必要はありません。「> file.log」だけで実行できます。
カム

ファイルを削除すると、作成日がリセ​​ットされます。
マッテオ

ファイルを削除すると、そのファイルを監視しているプログラムは、そのファイルへのポインタを失います(つまり、ファイルシステムに新しいアドレスが追加されます)。一般的に、yes 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

一度に1行ですか?

なんでもできる素敵なテキストエディタ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の> filenameと同じですが、より多くのシェルで動作します(クレジット)。真の組み込み(出力を持たない)からの出力をfilenameにリダイレクトします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.