最後の(または最初の)25%だけがファイルに残るようにファイルの最大75%を削除する方法はありますか?
ファイル全体を無効にすることができますが、cat /dev/null > /var/mail/root
この場合はファイルの最大75%までを削除(無効化)するだけです。
Bashでこれを行う方法はありますか?上記のコマンドの使用に関して私が見つけたすべての文書は100%効果がありません。
答え1
GNUを使用してファイルを75%に切り捨てるには、truncate
次のようにします。
size=$(wc -c < "$file") &&
truncate -s "$((size * 75 / 100))" -- "$file"
そしてksh93
:
<>; $file >#((EOF * 75 / 100))
前の部分を削除するには、通常、ファイルの内容を再作成する必要があります。これはファイル自体に書き込むことで実行できますksh93
。
command /opt/ast/bin/cat < $file <#((EOF * 25 / 100)) <>; $file
(ここで組み込みコマンドが使用されている理由は、GNUなどの他の実装が標準出力がksh93
標準入力と同じファイルを参照している場合はcat
動作を拒否するためです)。cat
cat
または以下を使用してくださいperl
。
perl -pe '
BEGIN{
seek(STDIN,0,2) or die$!;
seek(STDIN,tell(STDIN)*75/100,0) or die$!;
$/ = \65536
}
END{truncate STDOUT, tell STDOUT}' < "$file" 1<> "$file"
Linuxおよび一部のファイルシステムでは、ファイルを書き換えることなくファイルの終わり以降の部分を削除できますが、ファイルシステムのブロックサイズの倍数でのみ可能です。大きなファイルの場合、これで十分です。
block_size=$(stat -Lc %o -- "$file") &&
size=$(wc -c < "$file") &&
fallocate -cl "$((size * 25 / 100 / block_size * block_size)) -- "$file"