tar.gz 파일을 동시에 두 대상으로 추출하는 방법은 무엇입니까?

tar.gz 파일을 동시에 두 대상으로 추출하는 방법은 무엇입니까?

파일이 몇 개 있어요 tar.gz. tar.gz이 파일을 두 개의 USB 하드 드라이브에 추출 해야 합니다 . 이 명령을 사용하면 tar -xvzf한 번에 하나의 하드 드라이브에만 추출할 수 있습니다.tar.gz

tar.gz동시에 두 하드 드라이브에 파일을 추출 할 수 있는 방법을 제안해 주시면 감사하겠습니다. 마이그레이션해야 하는 파일의 전체 크기가 약 4.5TB이므로 시간을 많이 절약하는 데 도움이 됩니다.

답변1

파일 설명자를 여러 번 리디렉션할 때 zsh프로세스 대체 및 유사한 동작과 함께 사용하세요.tee

zcat file.tar.gz > >(cd /media/disk1 && tar xf -) > >(cd /media/disk2 && tar xf -)

프로세스 교체를 지원하는 기타 셸(ksh, bash)의 경우:

{
  zcat file.tar.gz 4>&- |
    tee >({ cd /media/disk1 && tar xf -; } >&4 4>&-) |
    { cd /media/disk2 && tar xf -; } 4>&-
} 4>&1

다음을 갖춘 시스템의 POSIXly /dev/fd/x:

zcat file.tar.gz | {
  {
    tee /dev/fd/3 |
      { cd /media/disk1 && tar xf -; } 3>&-
  } 3>&1 >&4 4>&- |
    { cd /media/disk2 && tar xf -; } 4>&-
} 4>&1

여러 파일에 대해 작업을 수행하려면 tar.gz이는 (여전히 zsh)

for f (*.tar.gz) zcat -- $f > >(cd /media/disk1 && tar xf -) > >(cd /media/disk2 && tar xf -)

파일은 가장 느린 대상 드라이브의 속도로 추출됩니다.

또 다른 접근 방식은 두 드라이브의 추출을 병렬로 실행하는 것입니다( sh여기서는 POSIX 구문 사용).

for f in *.tar.gz; do zcat -- $f | (cd /media/disk1 && tar xf -); done &
for f in *.tar.gz; do zcat -- $f | (cd /media/disk2 && tar xf -); done
wait

하지만 참고하세요:

  • 이는 각 파일의 압축을 두 번 풀어 더 많은 CPU 리소스를 사용한다는 의미입니다.
  • 한 대상 드라이브가 다른 드라이브보다 훨씬 느린 경우 일부 tar.gz파일은 결국 캐시에서 제거되어 컴퓨터에 더 많은 I/O가 발생하기 때문에 원본 디스크에서 두 번 읽히게 될 수 있습니다.

답변2

이를 사용 zcat하여 추출한 stdout다음 tee두 개의 다른 파일로 포크한 다음 tar두 파일 모두로 포크할 수 있습니다.

zcat bigfile.tar.gz | tee >(tar -xC /path/to/first/) | tar -xC path/to/second

대용량 파일을 "첫 번째" 및 "두 번째" 경로로 추출합니다.

다음과 같이 할 수도 있습니다 gunzip -c.

gunzip -c bigfile.tar.gz | tee >(tar -xC /path/to/first/) | tar -xC path/to/second

관련 정보