Bir dosyayı komut satırından nasıl kısaltabilirim?


9

Yaklaşık 1GB kısaltmak (yani kısaltmak) için 150GB xml dosyası var - kullanabileceğim basit (bash veya benzeri) bir komut var mı, yoksa (vi veya emacs'ta düzenleyerek programlı rotaya gitmek zorunda mıyım? büyük demir sistemlerinde bile bir kabus mu?)

(Özellikle bilgi kaybı konusunda endişelenmiyorum, daha kısa bir dosya istiyorum, bu yüzden bu konuda bir yazılım parçasını test edebilirim ve cevap için saatlerce bekleyemem, daha kısa bir dosya bunu yapmama izin verecektir.)


1
Yani dosyayı kısaltmak mı istiyorsun yoksa dosyadaki bilgileri mi kaldırmak istiyorsun?
AFH

1
CAB

2
Bu, çok sayıda öğeye sahip bir dizi içerdiğini düşündüğüm bir XML dosyası olduğundan, geçerli XML çıkışı avantajına sahip olacak bu öğelerin belirli bir sayısını filtrelemek için XQuery gibi bir XML dönüştürme dili de kullanabilirsiniz. ( Örnek )
Aaron

4
Tamamlandığında dosyanın geçerli XML olması gerekiyor mu?
Joe

1
o yüzden hayır, sadece onu yamalı
adrianmcmenamin

Yanıtlar:


15

150 GB dosyasının ilk 1 GB'ını kısaltmak ve çıkartmak istediğinizi varsayarsak:

İle head:

head -c 1G infile > outfile

Son Gekin GB1024 yerine 1000'e hizalanacak şekilde değiştirilebileceğini unutmayın .

Veya dd:

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

Veya Wumpus Q. Wumbley'in cevabında olduğu gibi, yerinde kesilebilir dd.


5
Bu, tamamlandığında okunabilir bir XML dosyasına neden olmaz.
Joe

3
@Joe - OP okunabilir bir dosya talep etmedi (ne de okunamaz olabileceğini söylediler). Bilgi kaybını önemsemediklerini söylediler. OP'den adı geçen dosyanın nasıl düzeltileceği hakkında yeni bir soru bekliyorum.
KevinDTimm

3
Düzeltmek için yeterli xml biliyorum, ben format için DTD yazdı!
adrianmcmenamin

37

Bir dosyayı 1 gigabayta kısaltmak için şu truncatekomutu kullanın:

truncate -s 1G file.xml

Kesme işleminin sonucu muhtemelen geçerli bir XML dosyası olmayacaktır, ancak bunu anladığınızı düşünüyorum.

GNU versiyonu için dokümantasyon truncateolduğunu burada BSD versiyonu için ve dokümantasyon burada


14

Mümkünse, truncatekomutu John1024'ün cevabındaki gibi kullanırdım . Bu standart bir unix komutu değil, bu yüzden bir gün kendinizi kullanamayacağınızı fark edebilirsiniz. Bu durumda, ddyerinde kesme de yapabilirsiniz.

dd'nin varsayılan davranışı, çıktı dosyasının kopyalamanın sona erdiği noktada kısaltılmasıdır, bu nedenle sadece 0 uzunlukta bir girdi dosyası verir ve istediğiniz kesme noktasında yazmaya başlamasını söylersiniz:

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

(Bu, ddmultithr3at3d'nin cevabındaki kopyala ve kes ile aynı değildir .)

1048576 ve 1024 kullandığımı unutmayın, çünkü 1048576 * 1024 istenen boyuttur. Bu bir "taşınabilirlik" cevabı, ve klasik çünkü bs = 1m kaçınılması ddsadece son ekleri bilir k, bve w.


2
Genel çözüm için, muhtemelen bssayıyla çarpılan sayının saklanacak seekbayt sayısı olduğuna dikkat etmelisiniz . Bu kısıtlamayı karşılayan herhangi iki sayı çalışmalıdır; örneğin, bs=1073741824 seek=1veya bs=1 seek=1073741824. Veya, bsvarsayılan olarak 512 olduğundan, seek=2097152tek başına da çalışmalıdır. Ve 1M, gibi gösterimleri kullanabilirsiniz 1K, 1Gve 2M.
G-Man

1

Ne istediğini tam olarak bilmiyorum. Sadece diğer 149 GB'den kurtulmak mı istiyorsun yoksa 150 GB'ı 1 GB'a sıkıştırmaya mı çalışıyorsun? Ne olursa olsun, bu bunu başarmak için yararlı bir yöntem olabilir.

splitKomut birden parçalara herhangi bir dosya ayırabilirsiniz. Bkz adam bölünmüş . Bu -bseçenekle bölmek istediğiniz dosya parçalarının boyutunu belirleyebilirsiniz . Örneğin:

$ split -b 1GB myfile.xml

Başka seçenek olmadan bu, geçerli dizinde harfle başlayan birkaç dosya oluşturmalıdır x. Bölünmüş dosyaların adlarını ayarlamak istiyorsanız kılavuz sayfasına bakınız.

Dosyayı yeniden birleştirmek için kullanın cat * > re-assembled.xml.

Misal:

[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

Sonunda ben sadece sedrastgele sayıda satır ayıklamak için kullanılır :

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

1
Bunun soruyu cevaplayıp yanıtlamamasını bir kenara bırakarak, tüm dosyayı tarar, inanıyorum, bu yüzden kullanımı çok daha verimli sed 1000000q(ve görsel olarak biraz daha kompakt).
B Katmanı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.