파일 시작 부분에서 바이트를 제거하는 가장 좋은 방법은 무엇입니까?

파일 시작 부분에서 바이트를 제거하는 가장 좋은 방법은 무엇입니까?

오늘 저는 새로운 저장소를 위해 해킹하고 있는 필터링된 하위 버전 덤프인 800MB 혼합 텍스트/바이너리 파일에서 처음 1131바이트를 제거해야 했습니다. 가장 좋은 접근 방식은 무엇입니까?

먼저 시도했습니다

dd bs=1 skip=1131 if=filtered.dump of=trimmed.dump

그러나 건너뛰고 나면 파일의 나머지 부분이 한 번에 한 바이트씩 복사됩니다. 즉, 매우 느립니다. 마침내 나는 그것을 3개의 512 청크로 반올림하려면 405바이트가 필요하다는 것을 알았고 건너뛸 수 있었습니다.

dd if=/dev/zero of=405zeros bs=1 count=405
cat 405zeros filtered.dump | dd bs=512 skip=3 of=trimmed.dump

꽤 빨리 완료되었지만 더 쉽고 더 나은 방법이 있을까요? 제가 잊어버린 다른 도구가 있나요?

답변1

bs를 전환하고 옵션을 건너뛸 수 있습니다.

dd bs=1131 skip=1 if=filtered.dump of=trimmed.dump

이렇게 하면 작업이 더 큰 청크에서 이점을 얻을 수 있습니다.

그렇지 않으면 tail을 사용해 볼 수 있습니다(바이너리와 함께 사용하는 것은 안전하지 않지만).

tail -c +1132 filtered.dump >trimmed.dump

마지막으로 3개의 dd 인스턴스를 사용하여 다음과 같이 작성할 수 있습니다.

dd if=filtered.dump bs=512k | { dd bs=1131 count=1 of=/dev/null; dd bs=512k of=trimmed.dump; }

이들 dd 중 첫 번째는 filter.dump를 표준 출력으로 인쇄하고, 두 번째는 1131바이트만 읽고 이를 버립니다. 그런 다음 마지막 dd는 표준 입력에서filtered.dump의 나머지 바이트를 읽고 이를 정리된 .dump에 씁니다.

답변2

언제 skip_bytes추가되었는지 확실하지 않지만 처음 11바이트를 건너뛰려면 다음을 수행하세요.

# 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_bytesdd에게 옵션 값을 skip블록이 아닌 바이트로 해석하도록 지시하여 간단하게 만듭니다.

답변3

서브셸과 다음과 같은 두 가지 호출을 사용할 수 있습니다 dd.

$ ( 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

답변4

사용해야 합니다 count=0. 이는 가능할 때마다 간단한 방법입니다.lseek()

이와 같이:

{  dd bs=1131 skip=1 count=0; cat; } <filtered.dump >trimmed.dump

ddlseek()입력 파일 설명자를 1131바이트 오프셋으로 이동 하고 cat나머지 내용을 출력에 복사하기만 하면 됩니다.

관련 정보