如何从命令行缩短文件?


9

我有一个150GB的xml文件,我想将其缩短(即截断)到大约1GB-我可以使用一个简单的命令(重击或类似命令),还是必须走程序化路线(在vi或emacs中对其进行编辑)即使在大型铁系统上也是一场噩梦吗?

(我并不特别担心信息的丢失,我想要一个较短的文件,以便可以在此上测试一个软件,而不必等待很长时间才能得到答案,较短的文件可以使我做到这一点。)


1
您是说要截断文件,还是要从整个文件中删除信息?
AFH

1
在SO上找到这个;stackoverflow.com/a/15934078/2800918
CAB

2
由于这是一个XML文件,我认为其中包含一个包含大量元素的序列,因此您还可以使用XML转换语言(例如XQuery)来过滤掉一定数量的这些元素,这将有利于输出有效的XML (示例
亚伦

4
完成后,文件仍然需要有效的XML吗?

1
不,我只是将其修补好了
adrianmcmenamin

Answers:


15

假设您要截断并提取150 GB文件中的前1 GB:

head

head -c 1G infile > outfile

请注意,G可以将后缀替换为GB以与1000而不是1024对齐。

或搭配dd

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

或者像Wumpus Q. Wumbley的回答一样,dd可以截断到位。


5
完成后,这很可能不会导致可读的XML文件。

3
@Joe-OP没有请求可读文件(他们也没有说该文件不可读)。他们确实说过,他们不关心信息丢失。我希望OP会提出一个有关如何修复上述文件的新问题。
KevinDTimm

3
我知道有足够的XML可以解决它,因此我为该格式编写了DTD!
adrianmcmenamin

37

要将文件截断为1 GB,请使用以下truncate命令:

truncate -s 1G file.xml

截断的结果可能不是有效的XML文件,但我认为您了解这一点。

对于GNU版本的文件truncate在这里和文档BSD版本是在这里


14

在可能的情况下,我将truncate按照John1024的答案使用该命令。但是,它不是标准的Unix命令,因此您可能有一天会发现自己无法使用它。在这种情况下,dd也可以执行原位截断。

dd的默认行为是在复制结束的位置截断输出文件,因此您只给它一个长度为0的输入文件,并告诉它在所需的截断点处开始写入:

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

(这与ddmultithr3at3d答案中的“复制并截断”不同。)

请注意,我使用了1048576和1024,因为1048576 * 1024是所需的大小。我避免BS =1米因为这是一个“便携性”的答案,经典dd只知道后缀kbw


2
对于一般解决方案,您可能应该注意,bs数字乘以seek数字就是要保留的字节数。满足该约束的任何两个数字都应该起作用;例如bs=1073741824 seek=1bs=1 seek=1073741824。或者,由于bs默认值为512,因此seek=2097152单独使用也应该有效。你也可以使用符号一样1M1K1G2M
G-Man说'恢复莫妮卡'

1

我不确定您要问什么。您是否只想摆脱其他149GB,还是要将150GB压缩为1GB?无论如何,这可能是完成此操作的有用方法。

split命令可以将任何文件分割成多个部分。见男人分裂。您可以使用该-b选项指定要分割成的文件块的大小。例如:

$ split -b 1GB myfile.xml

如果没有其他选择,则应在当前目录中以字母开头创建多个文件x。如果要调整拆分文件的名称,请参考手册页。

要重新组装文件,只需使用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层
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.