可能有一个简单的技巧可以做到这一点,但我无法从手册页中弄清楚。
例如,如何使用 来从未确定大小的文件中剪切最后 1MB dd
?
答案1
好吧,假设您有stat
和bash
,您可以通过以下方式获取文件大小:
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