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-file
Bourne과 유사한 쉘을 사용하여 이 작업을 수행할 수 있습니다.
cat small-file 1<> big-file
리디렉션 <>
연산자는 파일을 자르지 않고 읽기+쓰기 모드로 엽니다. 이는 dd
'를 사용하는 것과 동일 conv=notrunc
하지만 모든 문제와 제한 사항은 없습니다 dd
.
파일의 시작 부분이 아닌 다른 곳에 무언가를 쓰고 싶다면 파일에서 원하는 위치를 살펴봐야 합니다. 또는 와 같은 내장 검색 연산자와 함께 셸을 사용할 수도 있지만 이것이 dd
유용한 곳입니다 .seek=xxx
ksh93
zsh
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))