Linuxでファイルを特定のサイズにカットする方法は?


19

総当たりでファイルのサイズを縮小したい、つまり、残りを気にせず、ファイルを半分に切り、残りを破棄したいだけです。

最初に思い浮かぶのは、Perlの切り捨てです。私はそのページの例に従っていますが、まったく同じことをしました。

seq 9 > test.txt
ls -l test.txt
perl -we 'open( FILE, "< ./test.txt" ) && truncate( FILE, 8 ) && close(FILE);'

ただし、ファイルは同じサイズのままです。

$ ls -lgG test.txt
-rw-rw---- 1 18 2013-08-08 09:49 test.txt

この作業を行うにはどうすればよいですか?

回答:


62

truncateコマンドを使用することもできます。

truncate --size=1G test.txt

SIZEは、バイト、KB、K、MB、Mなどとして指定できます。手作業で希望のサイズを計算できると思います。そうでない場合は、おそらくstatコマンドを使用して、ファイルの現在のサイズに関する情報を取得できます。


そのドキュメントのcoreutilsから(info形式で)。
クリスティアンシウピトゥ14年

21
perl -we 'open( FILE, "< ./test.txt" ) && truncate( FILE, 8 ) && close(FILE);'

読み取り用にファイルを開きます。ただし、ファイルを切り捨てるには、変更する必要があるため、読み取り専用のファイルハンドルは機能しません。「変更」モード("+>")を使用する必要があります。

副次的な問題として、人々がシステムコールを静かに失敗させ、何が悪いのかを尋ねるとき、それはいつも私を驚かせます。本質的な問題を診断する部分が生成されたエラーメッセージを見ています。たとえそれを理解していなくても、助けを求める人の生活がずっと楽になります。

次の方がいくらか役立ちます。

perl -we 'open(FILE, "<", "./test.txt") or die "open: $!";
          truncate(FILE, 8) or die "truncate: $!";
          close(FILE);'

確かに、それは「無効な引数」を報告するだけでした。それでも、それは有用な情報であり、オープンモードが間違っていたという結論にあなたを導いたかもしれません(私にとってはそうでした)。


3

tail最後の100000バイトをカットするために使用できます。例:

tail -c 100000ファイル> file2

-cは、その他のオプションのために、ファイルの最後の100000バイトを出力します。

マンテール

元のファイルを生成したばかりのファイルに置き換えるには:

mv file2ファイル


2

上記の切り捨てを引用した答えは素晴らしいです。ddも仕事をします:

dd if=test.txt of=test2.txt bs=1 count=8
mv test2.txt test.txt

1
キーフレーズは「所定のサイズに」、たとえば1000です。代わりに、最も投票されたものに答えを変更します。
xpt

0

edプログラムを使用してbashでこれを行うには、まったく異なる方法があります。次のスクリプトは、指定されたディレクトリにあるすべてのファイルの最後の5000行のみを保持します。これは、いくつかのディレクトリをループしたり、行数を変更したりするように簡単に変更できます。

#!/bin/bash

LOGDIR=/opt/log
SAVELINES=5000

dirs="$LOGDIR"
for dir in $dirs ; do
    files=${dir}/*
    for f in $files ; do
        echo -e "1,-${SAVELINES}d\nwq" | ed $f 1>/dev/null 2>&1
    done
done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.