ファイルデータのX%を削除しますか? (ファイルの一部が無効です)

ファイルデータのX%を削除しますか? (ファイルの一部が無効です)

最後の(または最初の)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動作を拒否するためです)。catcat

または以下を使用してください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"

関連情報