如何正確清空文件

如何正確清空文件

好的,所以我正在嘗試清空文件。它是一個連續寫入的文字日誌檔案。我的 ls -lh 說它是 3​​GB

我跑

 > file.log

我的 ls -lh 說它仍然是 3GB

然而,包含該檔案的資料夾的大小減少了 3GB。很奇怪,數一下行數就知道它不是空的,而且我無法用 vim 打開它(太大)。

我沒有管理員訪問權限,但我是該文件的所有者。

我嘗試創建一個僅包含第一行的新文件來查看發生了什麼

head -1 file.log > first_line.txt

而first_line.txt是3GB。這確實是一種奇怪的行為。

問題 1:為什麼我的第一個指令沒有清空檔案?

問題2:如何清空檔案而不刪除它?

謝謝,

評論後編輯:檔案正在被其他進程連續開啟和寫入。

遺憾的是我無法幹擾這些進程,所以我無法暫時退出或重新啟動它們

答案1

您的檔案正被某個進程儲存,您無法刪除它。

用於lsof file.log了解哪個進程正在寫入它。

然後

mv file.log old.file.log

重新啟動該進程。 (這取決於流程)。

接下來,您將能夠刪除old.file.log.

如果您的文件 ID 列出,/etc/logrotate.d/*您可以發出 logrotate 命令。

答案2

若要(幾乎)清空文件,請使用指令

echo "" > file.log

或者,如果您的作業系統有它,

truncate file.log --size 0

會將其截斷為 0 位元組。

如果檔案沒有任何換行符,則整個檔案可能只有 1 行長,說明檔案大小為 3 gig。

您可以使用以下命令取得檔案範例

dd if=file.log of=firstpart.txt count=1 bs=200

這將佔用檔案的前 200 個位元組。 (如果需要更多,請將「bs」參數增加到4096,如果需要更多,請使用count參數,即獲得8192個區塊,count=2 bs=4096)

@Archemar 的建議很好,但我不確定它能回答你的問題。

相關內容