在某些情況下,您可能希望將現有文件截斷,即減少或者縮小文件的大小。簡單來說,截斷文件意味著刪除文件內容而不刪除文件。
截斷文件比刪除文件后重新創建文件并設置正確的權限和所有權。更快,更容易。
還有一點就是,如果要刪除的文件已經被其它進程打開,如果你此時刪除文件可能會導致使用該文件的進程沒有響應。但你可以嘗試將文件截斷。
本教程說明如何在Linux使用truncate命令將文件縮小或擴展到指定的大小。
truncate 命令截短/清空/填充文件
truncate命令的-s選項可讓您將文件的大小縮小或擴展到指定的大小。文件大小參數一個整數,該整數是任何數*1024。你也可以整數后面指定可選的單位參數。
單位可以是K,M,G,T,P,E,Z,Y或者是KB,MB,GB等。此外大小參數還可以指定一個前綴,如下。
+加號表示增加的大小, -減少指定的大小。還可以是大于<或者小于號>,增加或者減少指定大小,使用/ 進行四舍五入,%向上取整。
如果文件大于指定的大小,則會刪除額外的數據。如果文件較小,則對其進行擴展到指定大小,并且擴展部分的讀數為零字節。
truncate -s 0 filename命令將文件的縮小的零的大小。命令truncate -s +1M file1會在原來基礎再增加1M大小。
truncate -s 0 filename
truncate -s +1M filename
ls -al filename
truncate 命令清空日志文件
隨著時間的流逝,您的磁盤驅動器可能會堆滿很多大型日志文件,這些日志文件會占用大量磁盤空間。
此時,你可以運行命令sudo truncate -s 0 /var/log/**/*.log清空清空/var/log目錄以.log結尾的文件。
另一個更好的選擇是使用logrotate工具壓縮和刪除日志文件。
sudo truncate -s 0 /var/log/**/*.log
Shell 重定向清空文件
清空文件最簡單,最常用的方法是使用Shell重定向操作符>。使用重定向清空文件的命令是: > filename。
:返回零字節的空字符串,也可以理解為不產生任何輸出。重定向操作符>將命令:的輸出重定向到指定文件。
filename是您要清空的文件。如果文件存在,它將被清空為零的大小,即空文件,否則創建零字節的文件。
現在大多數Shell程序,例如Bash或Zsh,都可以在重定向符號之前省略命令,因此你可以將: > filename寫成> filename。
: > filename
> filename
除了:命令,你還可以使用另一個不產生任何輸出的命令cat /dev/null,/dev/null是空設備文件。
然后使用重定向操作符> 重定向到你要清空的文件,例如命令cat /dev/null > filename會清空文件filename。
此外還可以使用echo命令和-n選項。-n選項表示不輸出尾隨的換行符。例如命令echo -n > filename
cat /dev/null > filename
echo -n > filename
Sudo與Shell 重定向清空文件
要能夠清空文件,您需要對文件具有寫權限。通常您可能會因為權限問題而使用 sudo命令。
但是使用sudo提升權限不適用于重定向操作符>,例如命令sudo : > /var/log/syslog。
你的終端將會打印錯誤消息bash: /var/log/syslog: Permission denied。
sudo : > /var/log/syslog
bash: /var/log/syslog: Permission denied
遇到此問題時可以有幾種解決方案。第一種是使用sudo和sh命令啟動子shell運行命令。
另一種解決方案是將命令的標準輸出通過管道傳遞給tee命令,然后使用sudo將提升權限運行tee命令晴空文件。例如命令: | sudo tee filename。
sh命令的-c選項允許用戶指定要運行的命令,命令將會shell的子進程運行。命令sudo sh -c '> filename'創建shell子進程運行> filename命令。
sudo sh -c '> filename'
: | sudo tee filename
結論
要在Linux中截斷文件,請使用重定向操作符>,后跟文件名或者使用truncate命令。
-
Linux
+關注
關注
88文章
11760瀏覽量
219018 -
文件
+關注
關注
1文章
594瀏覽量
26054 -
命令
+關注
關注
5文章
755瀏覽量
23753 -
Shell
+關注
關注
1文章
375瀏覽量
25376
發布評論請先 登錄
如何在Linux使用truncate命令將文件縮小或擴展到指定的大小
評論