すでに存在し、何らかの方法で保護されているLinux上のファイルを空にする(「切り捨てる」)方法を教えてください。


113

サーバーにerror.logというファイルがあり、頻繁に切り捨てる必要があります。ファイルに対するrw権限があります。viでファイルを開く>すべてのコンテンツを削除する>作品を保存する(明らかに)。しかし、私が以下を試すと

cat /dev/null > error.log

メッセージを受け取ります

File already exists.

当然のことながら、ファイルの偶発的な上書きを防ぐために、サーバー上で何らかの構成が行われています。単一のコマンドでファイルを「切り捨てる」方法を誰かに教えてもらえますか?


2
保護されていないファイルの場合、切り捨て-s 0ファイルが機能します。
Pramod

回答:


158

noclobberオプションセットがあります。エラーはcshからのエラーのように見えるので、次のようにします。

cat /dev/null >! file

私が間違っていて、bashを使用している場合は、次のようにする必要があります。

cat /dev/null >| file

bashでは、次のように短縮することもできます。

>| file

あなたはシェルがcshであることについて正しいです。どうやってそれを知ったのですか?
Sumeet Pareek 2010年

6
@Wikidkaka-エラーメッセージに基づく。私のシステムのcshは同様のFile existsエラーを出しますが、bashは非常に異なるcannot overwrite existing fileエラーを出します。
R Samuel Klatchko、2010年

6
@Jarmund-ユーザーがnoclobberを設定しているため、機能>fileしません。
R Samuel Klatchko 2013年

違いは何だ> fileとは>| file
2014

1
@Will- noclobberオプションが設定されている場合、既存のファイルにリダイレクトしようとすると失敗します。上noclobberをを残したまま、特定のリダイレクトに無効にするには、使用することができます>|
RサミュエルKlatchko

71

関数truncateを使用することもできます

$truncate -s0 yourfile

許可が拒否された場合は、sudoを使用します

$sudo truncate -s0 yourfile

ヘルプ/マニュアル:切り捨て

ubuntu Linuxでテスト済み


1
truncateはファイルの変更時間にも影響しますが、ファイルが変更されていない場合、 "> file"は影響しません。
dsteinkopf 2017年

ファイルが保持するディスク容量は解放されません。最初は0バイトを表示します。しかし、そのファイルに何かを書き込むとき、ファイルサイズは=切り捨て前+新しいデータサイズです。
Aniket Kulkarni

48

これで、ファイルサイズを0に設定できます。

> error.log

6
実際、これ noclobber(自分でテストしたもの)では機能しないため、この場合は有効な解決策ではありません( "-bash:error.log:既存のファイルを上書きできません")。上記のコマンドを参照してください(「@Jarmund-ユーザーがnoclobberを設定しているため、> fileは機能しません。」)。どのような「インテリジェントな人々」がこのような明らかに間違った答えを

9

これは私の先輩の同僚の功績です。

:> filename

これはログファイルを壊さないので、たとえば、syslogで使用することもできます。


8
説明してください。それはどのように機能しますか?その表記は何をしていますか?
user31986

2
@ user31986 :は効果のないコマンド(ほとんどコメント)であり、>通常どおりリダイレクトされます。したがって、これは、何もしないコマンドからの出力の欠如をファイルにリダイレクトするだけです。noclobberが有効になっている場合は、:>| filename(bash)が必要です(:>! filenamecshにはcshがあると想定しています:)。
Rhubbarb 2017

4

false | tee fileToTruncate

うまくいくかもしれません


それはばかげている。または、これが便利な場合は、dd何も出力しないようにすることは、プレーンな可読性よりもさらに優れているでしょうfalseか?
tripleee 2016年

2

sudoはリダイレクト >では機能しないteeため、この目的のコマンドが好きです

echo "" | sudo tee fileName

まあ、実際にはそうです。あなたがリンクした質問と上記の両方で説明されています。"sudo sh -c '> error.log'" ...

ターゲットファイルの権限に依存しますerror.log。すでに書き込み可能であれば、sudoを実行する必要はありません。他の問題はあなたがコマンドを文字列引数としてに渡すことです、それshが内部でどのように処理されるのかわかりませんが、これは複雑さ/リダイレクトの追加のレイヤーです
sakhunzai

1
echo ""改行が追加されるため、実際にファイルが切り捨てられることはありません。を使用echo -n ""して改行を抑制できます
Seb

0

誰でもこのコマンドを試して、Linuxシステムの任意のファイルを切り捨てることができます

これは確かにどのフォーマットでも機能します:

truncate -s 0 file.txt


-4

あなたも試すことができます:

echo -n > /my/file


8
多数の投票で回答をご覧ください。それを読んでみて、調べてnoclobber、あなたの答えがまったく意味を成しているかどうかを自問してください。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.