web-dev-qa-db-ja.com

コマンドラインからファイルを短縮するにはどうすればよいですか?

150GBのxmlファイルを約1GBに短縮(つまり切り捨て)したいのですが、使用できる簡単な(bashまたは同様の)コマンドがありますか、それともプログラムによるルート(viまたはemacsで編集)を実行する必要がありますか?大きな鉄システムでも悪夢です)?

(私は特に情報の損失について心配していません。私はこれでソフト​​ウェアの一部をテストでき、答えを何時間も待たずにできるように短いファイルが必要です。短いファイルでそれが可能になります。)

9
adrianmcmenamin

150GBファイルの最初の1GBを切り捨てて抽出するとします。

headの場合:

head -c 1G infile > outfile

GサフィックスをGBに置き換えて、1024ではなく1000に揃えることができることに注意してください。

またはddを使用:

dd if=infile of=outfile bs=1M count=1024

または、Wumpus Q. Wumbleyの回答のように、ddはその場で切り捨てることができます。

15
multithr3at3d

ファイルを1ギガバイトに切り捨てるには、truncateコマンドを使用します。

truncate -s 1G file.xml

切り捨ての結果は有効なXMLファイルではない可能性がありますが、ご理解いただけると思います。

GNUバージョンのtruncateのドキュメントは ここ であり、BSDバージョンのドキュメントは ここ です。

37
John1024

可能であれば、John1024の回答のようにtruncateコマンドを使用します。ただし、これは標準のUNIXコマンドではないため、いつか使用できなくなる可能性があります。その場合、ddはインプレース切り捨ても実行できます。

ddのデフォルトの動作では、コピーが終了した時点で出力ファイルが切り捨てられるため、長さ0の入力ファイルを指定して、目的の切り捨てポイントから書き込みを開始するように指示します。

dd if=/dev/null of=filename bs=1048576 seek=1024

(これは、multithr3at3dの回答のコピーアンドトランケートddと同じではありません。)

1048576 * 1024が望ましいサイズであるため、1048576と1024を使用したことに注意してください。これは「移植性」の答えであり、古典的なddは接尾辞kb、およびwしか知らないため、bs = 1mを避けました。

14
user240960

私はあなたが何を求めているのか完全にはわかりません。他の149GBを削除したいだけですか、それとも150GBを1GBに圧縮しようとしていますか?とにかく、これはこれを達成するための便利な方法かもしれません。

splitコマンドは、任意のファイルを複数の部分に分割できます。 man split を参照してください。 -bオプションを使用して、分割するファイルチャンクのサイズを指定できます。例えば:

$ split -b 1GB myfile.xml

他のオプションがない場合、これにより、文字xで始まる複数のファイルが現在のディレクトリに作成されます。分割ファイルの名前を調整したい場合は、manページを参照してください。

ファイルを再アセンブルするには、cat * > re-assembled.xmlを使用するだけです。

例:

[kent_x86.py@c7 split-test]$ ls -l opendocman*
-rw-rw-r--.  1 kent_x86.py kent_x86.py 2082602 Mar 31  2017 opendocman-1.3.5.tar.gz

[kent_x86.py@c7 split-test]$ split -b 100K opendocman-1.3.5.tar.gz 
[kent_x86.py@c7 split-test]$ ls
opendocman-1.3.5.tar.gz  xaa  xab  xac  xad  xae  xaf  xag  xah  xai  xaj  xak  xal  xam  xan  xao  xap  xaq  xar  xas  xat  xau
[kent_x86.py@c7 split-test]$ ll
total 4072
-rw-rw-r--. 1 kent_x86.py kent_x86.py 2082602 Jan  5 11:06 opendocman-1.3.5.tar.gz
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xaa
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xab
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xac
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xad
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xae
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xaf
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xag
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xah
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xai
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xaj
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xak
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xal
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xam
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xan
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xao
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xap
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xaq
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xar
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xas
-rw-rw-r--. 1 kent_x86.py kent_x86.py  102400 Jan  5 11:06 xat
-rw-rw-r--. 1 kent_x86.py kent_x86.py   34602 Jan  5 11:06 xau
[kent_x86.py@c7 split-test]$ cat xa* > opendoc-reassembled.tar.gz
[kent_x86.py@c7 split-test]$ ls -l opendoc-reassembled*
-rw-rw-r--. 1 kent_x86.py kent_x86.py 2082602 Jan  5 11:07 opendoc-reassembled.tar.gz
1
Kentgrav

splitコマンドを使用できます。

split -C 1G <filename>

詳細については、これを見てください stackoverflow answer

0
ventsyv

結局、私はsedを使用して、任意の数の行を抽出しました。

sed -n 1,1000000p infile.xml>outfile.xml
0
adrianmcmenamin