두 파일의 블록을 연결해야 합니다.
전체 파일을 연결해야 한다면 간단히 할 수 있습니다.
cat file1 file2 > output
하지만 첫 번째 파일에서 처음 1MB를 건너뛰어야 하고 두 번째 파일에서는 10MB만 필요합니다. 직업인 것 같군요 dd
.
dd if=file1 bs=1M count=99 skip=1 of=temp1
dd if=file2 bs=1M count=10 of=temp2
cat temp1 temp2 > final_output
이 작업을 한 단계로 수행할 수 있습니까? 즉, 중간 결과를 저장할 필요가 없나요? 에서 여러 입력 파일을 사용할 수 있나요 dd
?
답변1
dd
표준 출력에 쓸 수도 있습니다.
( dd if=file1 bs=1M count=99 skip=1
dd if=file2 bs=1M count=10 ) > final_output
답변2
한 번의 호출로 여러 파일을 쉽게 읽을 수는 없을 것 같지만 dd
몇 단계만 추가하면 출력 파일을 만들 수 있습니다.
dd if=file1 bs=1M count=99 skip=1 of=final_output
dd if=file2 bs=1M count=10 of=final_output oflag=append conv=notrunc
conv=notrunc
및 를 모두 지정해야 합니다 oflag=append
. 첫 번째는 출력이 잘리는 것을 방지하고 두 번째는 기존 파일의 끝에서 쓰기 시작합니다.
답변3
이것이 dd
시스템 호출에 대한 원래 인터페이스라는 것을 기억하십시오. 일반 파일, 블록 장치 및 특정 문자 장치(예: 파일 끝에 도달하지 않는 한 반환이 보장되는 파일)에서 데이터 블록을 추출하는 데에만 안정적으로 사용할 수 있습니다.read()
write()
lseek()
/dev/urandom
read(buf, size)
size
read()
파이프, 소켓 및 대부분의 문자 장치(tty와 같은)의 경우 크기 1을 수행하거나 GNU 확장을 사용하지 않는 한 dd
그러한 보장이 없습니다 iflag=fullblock
.
따라서 다음 중 하나를 수행하십시오.
{
gdd < file1 bs=1M iflag=fullblock count=99 skip=1
gdd < file2 bs=1M iflag=fullblock count=10
} > final_output
또는:
M=1048576
{
dd < file1 bs=1 count="$((99*M))" skip="$M"
dd < file2 bs=1 count="$((10*M))"
} > final_output
또는 검색 연산자를 기본적으로 지원하는 셸을 사용하세요 ksh93
. 예를 들면 다음과 같습니다.
M=1048576
{
command /opt/ast/bin/head -c "$((99*M))" < file1 <#((M))
command /opt/ast/bin/head -c "$((10*M))" < file2
}
또는 zsh
( 여기서 옵션을 head
지원 한다고 가정):-c
zmodload zsh/system &&
{
sysseek 1048576 && head -c 99M &&
head -c 10M < file2
} < file1 > final_output
답변4
와세게 때리다교의, 기능적으로 "쓸모없는 용도"고양이"이지만 OP에서 사용하는 구문에 가장 가깝습니다.
cat <(dd if=file1 bs=1M count=99 skip=1) \
<(dd if=file2 bs=1M count=10) \
> final_output
(즉, Stephen Kitt의 답변이 가장효율적인가능한 방법. )