dd: 여러 입력 파일

dd: 여러 입력 파일

두 파일의 블록을 연결해야 합니다.

전체 파일을 연결해야 한다면 간단히 할 수 있습니다.

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/urandomread(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의 답변이 가장효율적인가능한 방법. )

관련 정보