Best way to remove bytes from the start of a file?
You can switch bs and skip options:
dd bs=1131 skip=1 if=filtered.dump of=trimmed.dump
This way the operation can benefit from a greater block.
Otherwise, you could try with tail (although it's not safe to use it with binary files):
tail -c +1132 filtered.dump >trimmed.dump
Finally, you may use 3 dd instances to write something like this:
dd if=filtered.dump bs=512k | { dd bs=1131 count=1 of=/dev/null; dd bs=512k of=trimmed.dump; }
where the first dd prints its standard output filtered.dump; the second one just reads 1131 bytes and throws them away; then, the last one reads from its standard input the remaining bytes of filtered.dump and write them to trimmed.dump.
Not sure when skip_bytes
was added, but to skip the first 11 bytes you have:
# echo {123456789}-abcdefgh- |
dd bs=4096 skip=11 iflag=skip_bytes
-abcdefgh-
0+1 records in
0+1 records out
11 bytes (11 B) copied, 6.963e-05 s, 158 kB/s
Where iflag=skip_bytes
tells dd to interpret the value for the skip
option as bytes instead of blocks, making it straightforward.
You can use a sub-shell and two dd
calls like this:
$ ( dd bs=1131 count=1 of=dev_null && dd bs=4K of=out.mp3 ) < 100827_MR029_LobbyControl.mp3
1+0 records in
1+0 records out
1131 bytes (1.1 kB) copied, 7.9691e-05 s, 14.2 MB/s
22433+1 records in
22433+1 records out
91886130 bytes (92 MB) copied, 0.329823 s, 279 MB/s
$ ls -l *
-rw------- 1 max users 91887261 2011-02-03 22:59 100827_MR029_LobbyControl.mp3
-rw-r--r-- 1 max users 1131 2011-02-03 23:04 dev_null
-rw-r--r-- 1 max users 91886130 2011-02-03 23:04 out.mp3
$ cat dev_null out.mp3 > orig
$ cmp 100827_MR029_LobbyControl.mp3 orig