ディスク容量不足:ファイルをコピーせずにテキストファイルの最初のn行を削除する[重複]

ディスク容量不足:ファイルをコピーせずにテキストファイルの最初のn行を削除する[重複]

$rmv.という巨大なテキストファイルの最初の行を削除したいと思います$filename。このテキストファイルは大きすぎて、私のハードドライブに2つのコピーを保存できません。

以下は、次の空のファイルを残します$filename

tail -n +$rmv "$filename" > "$filename" 

$filename合計を保存するための空き容量が不足しているため、以下を実行できません$filename.tmp

tail -n +$rmv "$filename" > "$filename.tmp" && mv "$filename.tmp" "$filename"

重要な場合は、Mac OS X El Capitanを使用しています。

答え1

あなたが持っている場合perl

{
  tail -n +"$rmi"
  perl -e 'truncate STDOUT, tell STDOUT'
} <file 1<>file

この方法ではファイルのバックアップがないため、破損が発生するとデータが失われる可能性があります。

答え2

ed一時ファイルは使用していないようです。

ed bigfile <<ED_SCRIPT
1,${rmv}d
w
q
ED_SCRIPT

答え3

スクリプトファイル編集の場合、選択したツールはex

ex -sc "1,${rmv}d | x" "$filename"

また、見ることができますsplit便利

答え4

あなたのテキストファイルはxMBで、2 * xMBはありませんが、ファイルを圧縮するのに十分なスペースがないと思いますか?テキストファイルは通常、元のサイズの1/10に圧縮されます。

($total-$rmv) 行を収容するのに十分なスペースがありません。しかし、圧縮するとどうなりますか?tail -n +$rmv "$filename" | gzip > "$filename.tmp" && zcat "$filename.tmp" > "$filename"

これを抽象的な知的問題と考えてファイルを塊に切り、メモリや使用可能なディスク領域に合わせてサイズを変更し、最後の塊から始めて元のファイルを切り取ります。また、ファイルを所定の場所に圧縮するためにトリックを使用することもできますdd conv=notrunc

しかし実際に私は

  • ($total-$rmv)行を(のみ)保持するのに十分なディスクを持つサーバーにネットワーク経由でファイルをコピーし、正しい行が得られたことを確認し、元のファイルを削除して再コピーしました。

  • 明らかに必要なので、ディスクを追加します。

関連情報