dd가 파일의 일부를 덮어쓸 수 있나요? [복사]

dd가 파일의 일부를 덮어쓸 수 있나요? [복사]

1TB의 대용량 파일(손상된 드라이브의 디스크 이미지)과 1.3MB의 작은 파일(디스크 파일의 시작 부분)이 있습니다.

작은 파일의 내용을 사용하여 큰 파일의 내용 중 일부를 덮어쓰고 싶습니다. 즉, 1TB 이미지의 처음 1.3MB를 작은 파일로 삽입/덮어쓰고 싶습니다.

작은 임시 파일로 테스트할 때 파일의 일부를 덮어쓸 수 없습니다. 대신 dd는 파일을 완전히 덮어씁니다. 이것은 내가 원하는 것이 아닙니다.

dd가 이걸 할 수 있나요?

답변1

이 매개변수를 사용하면 conv=notrunc처음 몇 바이트만 바꿀 수 있습니다.
예를 들어 dd conv=notrunc if=small.img of=large.img

root@debian:~/ddtest# dd if=/dev/zero of=file1.img bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 1.14556 s, 9.2 MB/s
root@debian:~/ddtest# dd if=/dev/urandom of=file2.img bs=1M count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.207185 s, 5.1 MB/s
root@debian:~/ddtest# head file1.img 

<< Blank space here as it's all Zeroes >>

root@debian:~/ddtest# dd conv=notrunc if=file2.img of=file1.img 
2048+0 records in
2048+0 records out
1048576 bytes (1.0 MB) copied, 0.00468016 s, 224 MB/s
root@debian:~/ddtest# head file1.img 
^�v�y�ے!� E�91����  << SNIP Random garbage >>
root@debian:~/ddtest# 

답변2

파일의 시작 부분만 덮어쓰고 나머지는 변경하지 않으려면 다음을 사용하십시오.conv=notrunc잘림을 방지하는 옵션:

dd conv=notrunc if=/dev/zero of=test bs=1024 count=1024

notrunc 방법:

출력 파일을 자르지 마십시오. 이 호출로 명시적으로 기록되지 않은 블록을 출력 파일에 보존합니다.DD유용.

POSIX 형식이므로 모든 버전이 지원됩니다 dd.

답변3

재정의하고 싶다면시작big-file나머지 부분에 영향을 주지 않고 small-fileBourne과 유사한 쉘을 사용하여 이 작업을 수행할 수 있습니다.

cat small-file 1<> big-file

리디렉션 <>연산자는 파일을 자르지 않고 읽기+쓰기 모드로 엽니다. 이는 dd'를 사용하는 것과 동일 conv=notrunc하지만 모든 문제와 제한 사항은 없습니다 dd.

파일의 시작 부분이 아닌 다른 곳에 무언가를 쓰고 싶다면 파일에서 원하는 위치를 살펴봐야 합니다. 또는 와 같은 내장 검색 연산자와 함께 셸을 사용할 수도 있지만 이것이 dd유용한 곳입니다 .seek=xxxksh93zsh

cat small-file 1<> big-file >#((12345)) # ksh93

zmodload zsh/system; {sysseek -u1 12345 && cat small-file} 1<> big-file # zsh

답변4

예:

printf '\xa1' | dd conv=notrunc of=Yourfile bs=1 seek=$((0xoffset))

관련 정보