Saya memiliki file 150ml xml yang ingin saya persingkat (yaitu terpotong) menjadi sekitar 1GB - apakah ada perintah (bash atau serupa) yang sederhana yang dapat saya gunakan, atau apakah saya harus pergi dengan rute program (mengeditnya di vi atau emacs adalah mimpi buruk bahkan pada sistem besi besar)?
(Saya tidak terlalu peduli dengan hilangnya informasi, saya ingin file yang lebih pendek sehingga saya bisa menguji perangkat lunak ini dan tidak menunggu berjam-jam untuk jawabannya, file yang lebih pendek akan memungkinkan saya melakukan itu.)
bash
unix
file-management
adrianmcmenamin
sumber
sumber
Jawaban:
Dengan asumsi Anda ingin memotong dan mengekstrak 1 GB pertama dari 150 GB file:
Dengan
head
:head -c 1G infile > outfile
Perhatikan bahwa
G
akhiran bisa diganti denganGB
untuk menyelaraskan ke 1000, bukan 1024.Atau dengan
dd
:dd if=infile of=outfile bs=1M count=1024
Atau seperti dalam jawaban Wumpus Q. Wumbley,
dd
dapat terpotong di tempat.sumber
Untuk memotong file hingga 1 gigabyte, gunakan file
truncate
perintah:Hasil pemotongan kemungkinan bukan file XML yang valid tapi saya rasa Anda mengerti itu.
Dokumentasi untuk versi GNU dari
truncate
aku s sini dan dokumentasi untuk versi BSD adalah sinisumber
Jika memungkinkan, saya akan menggunakan
truncate
perintah seperti pada jawaban John1024. Ini bukan perintah unix standar, jadi Anda mungkin suatu hari tidak dapat menggunakannya. Dalam hal itu,dd
dapat melakukan pemotongan di tempat juga.dd
Perilaku default adalah memotong file output pada titik di mana penyalinan berakhir, jadi Anda cukup memberikan file input 0-panjang dan suruh untuk mulai menulis pada titik pemotongan yang diinginkan:(Ini tidak sama dengan copy-dan-terpotong
dd
dalam jawaban multithr3at3d.)Perhatikan bahwa saya menggunakan 1048576 dan 1024 karena 1048576 * 1024 adalah ukuran yang diinginkan. Saya menghindari bs = 1m karena ini adalah jawaban "mudah dibawa", dan klasik
dd
hanya tahu akhirank
,b
, danw
.sumber
bs
angka dikalikan denganseek
number adalah jumlah byte yang harus disimpan. Dua angka yang memenuhi batasan harus berfungsi; misalnya.,bs=1073741824 seek=1
ataubs=1 seek=1073741824
. Atau sejak itubs
default ke 512,seek=2097152
sendirian juga harus bekerja. Dan Anda dapat menggunakan notasi seperti1M
,1K
,1G
dan2M
.Saya tidak sepenuhnya yakin apa yang Anda minta. Apakah Anda hanya ingin menyingkirkan 149GB lainnya atau Anda mencoba mengompres 150GB menjadi 1 GB? Bagaimanapun, ini mungkin metode yang berguna untuk mencapai ini.
Itu
split
perintah dapat membagi file apa pun menjadi beberapa bagian. Lihat pria berpisah . Anda dapat menentukan ukuran potongan file yang ingin Anda bagi dengan-b
pilihan. Contohnya:$ split -b 1GB myfile.xml
Tanpa opsi lain, ini harus membuat beberapa file dalam direktori saat ini dimulai dengan huruf
x
. Jika Anda ingin menyesuaikan nama file yang dibagi, lihat halaman manual.Untuk merakit kembali file cukup gunakan
cat * > re-assembled.xml
.Contoh:
sumber
Anda dapat menggunakan
split
perintah.Untuk lebih jelasnya lihat ini jawaban stackoverflow
sumber
Pada akhirnya saya hanya menggunakan
sed
untuk mengekstrak sejumlah baris yang berubah-ubah:sumber
sed 1000000q
(dan sedikit lebih kompak, secara visual).