파일이 몇 개 있어요 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