web-dev-qa-db-ja.com

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

ファイルのサイズをブルートフォースで縮小したいのです。つまり、残りは気にせず、ファイルを半分にカットして、残りを破棄します。

最初に頭に浮かぶのは、Perlの truncate です。そのページの例に従って、まったく同じことを行いました。

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

どうすればこれを機能させることができますか?

21
xpt

truncateコマンド を使用することをお勧めします。

truncate --size=1G test.txt

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

65
ChrisInEdmonton
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);'

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

21
rici

tailを使用して、最後の100000バイトを切り取ることができます。例:

tail -c 100000ファイル> file2

-cは、ファイルの最後の100000バイトを出力します。さらに多くのオプションがあります。

男のしっぽ

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

mv file2ファイル

3
Ivan Malyshev

上記のtruncateを引用した答えはいいです。 ddも機能します。

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

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
0
richard