使用 dd 剪切文件末尾部分

使用 dd 剪切文件末尾部分

可能有一个简单的技巧可以做到这一点,但我无法从手册页中弄清楚。

例如,如何使用 来从未确定大小的文件中剪切最后 1MB dd

答案1

好吧,假设您有statbash,您可以通过以下方式获取文件大小:

stat -c %s your_file

如果您想使用 提取$amount该文件的最后一个字节dd,您可以:

dd if=your_file of=extracted_part \
   bs=1 count=$amount \
   skip=$(( $(stat -c %s your_file) - $amount ))

但更明智的方法是使用tail

tail -c $(( 1024*1024 )) your_file > target_file

答案2

dd --帮助
用法:dd [操作数]...
  或:dd 选项
复制文件,根据操作数进行转换和格式化。

  bs=BYTES 一次读取和写入 BYTES 个字节(另请参见 ibs=,obs=)
  cbs=BYTES 一次转换 BYTES 字节
  conv=CONVS 根据逗号分隔的符号列表转换文件
  count=BLOCKS 仅复制 BLOCKS 个输入块
  ibs=BYTES 一次读取 BYTES 字节(默认值:512)
  if=FILE 从 FILE 而不是 stdin 读取
  iflag=FLAGS 按照逗号分隔的符号列表读取
  obs=BYTES 一次写入 BYTES 个字节(默认值:512)
  of=FILE 写入 FILE 而不是 stdout
  oflag=FLAGS 按照逗号分隔的符号列表写入
  eek=BLOCKS 在输出开始时跳过 BLOCKS obs 大小的块
  Skip=BLOCKS 在输入开始时跳过 BLOCKS ibs 大小的块
  status=noxfer 抑制传输统计信息

BLOCKS 和 BYTES 后面可以跟以下乘法后缀:
c=1,w=2,b=512,kB=1000,K=1024,MB=1000*1000,M=1024*1024,xM=M
GB =1000*1000*1000,G =1024*1024*1024,T、P、E、Z、Y 依此类推。

如果文件大小正好是10MB,1024*10 10240K 这样就剩下最后的1024K。您应该使用 ibs 和 obs 选项指定正在使用的块大小。

1M = 1024K 
1024*9 = 9216  
dd if=/10/MB/file of=/9/MB/file count=9216K ibs=1K obs=1K
dd if=/10/MB/file of=/9/MB/file count=9M ibs=1M obs=1M

您还可以跳过文件的前 1MB,使用跳过选项读取到文件末尾,跳过前 1MB。

dd if=/10/MB/file of=/9/MB/file skip=1M ibs=1M obs=1M

使用查找选项,您可以将 a 写入输出文件中的特定位置。假设您想保留前 1MB 并覆盖最后 8MB。

dd if=/10/MB/file of=/9/MB/file skip=1M seek=1M count=8M ibs=1M obs=1M

您可能需要获取有关文件大小的一些详细信息,以确保输入和输出正确数量的数据。

ls -s --block-size 1K ./my/10MB/file
曼LS

       --块大小=大小
              使用 SIZE 字节块。请参阅下面的 SIZE 格式

       -s,--大小
              打印每个文件的分配大小(以块为单位)

       SIZE 可以是(或者可以是可选地后跟的整数)以下之一:
       低:KB 1000、K 1024、MB 1000*1000、M 1024*1024,G、T 依此类推,
       P、E、Z、Y。

答案3

要使用 截断文件而不复制它dd,您需要将输入文件设置为/dev/null,并让dd截断搜索点处的输出(目标)文件。例如:

dd if=/dev/null of=somefile.txt bs=1M seek=10

将截断一些文件.txt10MB。

但是,由于您的文件长度可变,并且您希望从末尾删除固定数量,因此请查看该truncate命令。其工作原理更加简单,因为truncate <file> --size=X其中X可以是绝对量或相对量。如果新的尺寸更大,它也会扩展一个文件(使用一个洞)。看:

$ dd if=/dev/urandom of=somefile.txt bs=1M count=13
13631488 bytes (14 MB, 13 MiB) copied, 0.0661225 s, 206 MB/s
$ ls -lh somefile.txt 
-rw-rw-r-- 1 13M Sep 28 20:18 somefile.txt
$ truncate -s -3M somefile.txt  # remove the trailing 3MB
$ ls -lh somefile.txt 
-rw-rw-r-- 1 10M Sep 28 20:18 somefile.txt

使用相同dd,但没有相对大小:

$ dd if=/dev/urandom of=somefile.txt bs=1M count=13
13631488 bytes (14 MB, 13 MiB) copied, 0.0669367 s, 204 MB/s
$ ls -lh somefile.txt 
-rw-rw-r-- 1 13M Sep 28 20:21 somefile.txt
$ dd if=/dev/null of=somefile.txt bs=1M seek=10
0 bytes copied, 3.6978e-05 s, 0.0 kB/s
$ ls -lh somefile.txt 
-rw-rw-r-- 1 10M Sep 28 20:22 somefile.txt

相关内容