如何从命令行缩短文件?

adr*_*min 9 unix file-management bash

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

(我并不特别担心信息丢失,我想要一个更短的文件,这样我就可以测试一个软件,而不用等待几个小时的答案,一个更短的文件将允许我这样做。)

Joh*_*024 37

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

truncate -s 1G file.xml
Run Code Online (Sandbox Code Playgroud)

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

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


mul*_*t3d 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可以在原地截断。

  • 完成后,这可能不会产生可读的 XML 文件。 (5认同)
  • @Joe - OP 没有请求可读文件(他们也没有说它可能不可读)。他们确实说他们不在乎信息丢失。我希望 OP 提出一个关于如何修复所述文件的新问题。 (3认同)
  • 我知道足够的 xml 来修复它,我为格式编写了 DTD! (3认同)

小智 14

在可能的情况下,我会使用truncateJohn1024 的回答中的命令。不过,这不是标准的 unix 命令,所以有一天您可能会发现自己无法使用它。在这种情况下,dd也可以进行就地截断。

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

dd if=/dev/null of=filename bs=1048576 seek=1024
Run Code Online (Sandbox Code Playgroud)

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

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

  • 对于一般的解决方案,您可能应该注意到 `bs` 数字乘以 `seek` 数字是要保留的字节数。满足该约束的任何两个数字都应该有效;例如,``bs=1073741824 seek=1`` 或``bs=1 seek=1073741824``。或者,由于 `bs` 默认为 512,单独使用 `seek=2097152` 也应该有效。您可以使用诸如“1M”、“1K”、“1G”和“2M”之类的符号。 (2认同)