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


9

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

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


1
ファイルを切り捨てるか、ファイル全体から情報を削除しますか?
AFH

1
SOでこれを見つけました。stackoverflow.com/a/15934078/2800918
CAB

2
これはXMLファイルであり、多数の要素を含むシーケンスが含まれていると想定しているため、XQueryなどのXML変換言語を使用して、これらの要素の特定の数を除外することもできます。これにより、有効なXMLを出力できるという利点があります。 (
アーロン

4
完了しても、ファイルは有効なXMLである必要がありますか?
Joe

1
いいえ、パッチを適用しました
adrianmcmenamin

回答:


15

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

head

head -c 1G infile > outfile

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

またはdd

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

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


5
完了しても、XMLファイルが読み取り可能にならない可能性があります。
Joe

3
@Joe-OPは読み取り可能なファイルを要求しませんでした(また、読み取り不可能であるとは言われていませんでした)。彼らは情報の損失を気にしないと言った。上記のファイルを修正する方法について、OPからの新しい質問を期待します。
KevinDTimm 2018年

3
私はそれを修正するのに十分なxmlを知っています、そのフォーマットのDTDを書きました!
adrianmcmenamin 2018年

37

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

truncate -s 1G file.xml

切り捨ての結果はおそらく有効なXMLファイルではありませんが、私はあなたがそれを理解していることを収集します。

のGNUバージョンのドキュメントtruncateこちら、BSDバージョンのドキュメントはこちら


14

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

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

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

(これはddmultithr3at3dの回答のcopy-and-truncateと同じではありません。)

1048576 * 1024が望ましいサイズであるため、1048576と1024を使用したことに注意してください。これは「ポータビリティ」の答えで、クラシックはので、私は、BS = 1メートルを避けるddだけサフィックスを知っているkbw


2
一般的なソリューションでは、bs数に数を掛けたseek値が保持するバイト数になることに注意してください。その制約を満たす2つの数値が機能するはずです。例:bs=1073741824 seek=1またはbs=1 seek=1073741824。または、bsデフォルトは512なので、seek=2097152単独でも機能します。そして、次のような表記を使用することができ1M1K1G2M
G-Manが 'Reinstate Monica'を

1

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

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


0

最後に、私sedは任意の数の行を抽出するために使用しました:

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

1
これが質問に答えるかどうかはさておき、これはファイル全体をスキャンするので、使用する方がはるかに効率的ですsed 1000000q(視覚的に言えば、もう少しコンパクトです)。
Bレイヤー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.