내 디렉토리에는 크기가 6.7GB인 파일이 28,000개 있습니다 aaa/input
.
aaa/output
각 TAR 파일이 1.9GB를 초과할 수 없도록 디렉터리에 TAR 파일을 생성해야 하므로 아래와 같이 28,000개의 파일을 4개의 TAR 파일(6.7/1.9)로 압축해야 합니다.
Log_(current date)_01.tar
Log_(current date)_02.tar
...
etc.
각 타르볼을 1.9GB보다 작게 유지하십시오.
Unix 스크립트를 사용하여 이를 수행할 수 있는 방법이 있습니까?
답변1
tar
다음을 조합하여 split
이를 달성 할 수 있습니다 .
tar cf - aaa/input | split --bytes=1900m --filter='gzip > $FILE.gz' --numeric-suffixes - ./Log-
이 명령은 tar
stdout에 대한 아카이브를 생성하고 출력을 split
1900MB마다 분할하는 명령으로 파이프하고, gzip을 통해 데이터를 필터링하고, stdin을 입력(the -
)으로 사용하고 출력을 접두사와 함께 현재 디렉터리에 배치합니다.Log-
출력은 다음과 같습니다.
./Log-00.gz
./Log-01.gz
..
split
입력이 1900M로 분할되고 압축 후에는 작아지기 때문에 파일 크기가 더 작아집니다 .
아니면 당신은 사용할 수 있습니다
printf 'n Log-%02d.tar\n' {2..4}|tar cf Log-01.tar -ML1900m aaa/input
아카이브를 만듭니다.
n
명령의 첫 번째 명령은 다음 아카이브의 새 이름을 printf
나타냅니다 . tar
이것이 범위가 2부터 시작되는 이유입니다.
일반적으로 tar가 새 아카이브를 묻는 메시지를 표시하면 다음이 표시됩니다.
Prepare volume #2 for '<my tar file>' and hit return:
누르면 ?
다음과 같은 단축 메뉴가 나타납니다.
n name Give a new file name for the next (and subsequent) volume(s)
q Abort tar
y or newline Continue operation
! Spawn a subshell
? Print this list
답변2
GNU tar를 실행할 수 있으면 옵션 --tape-length=N
및 .--new-volume-script
볼륨을 생성하는 명령은 다음과 같습니다.
tar cvf volume /path/to/files --tape-length=1945M --new-volume-script=/path/to/script.sh
그리고 그것으로부터 모든 것을 추출합니다:
tar xvf volume --new-volume-script=/path/to/script.sh
~을 위한새 볼륨 스크립트다음 중 하나를 사용할 수 있습니다(tar
gnu.org 문서). 볼륨 생성, 나열, 비교 및 추출과 함께 작동합니다. 또는 이를 수정하여 볼륨 이름을 변경하거나 처음부터 자신만의 볼륨 이름을 작성할 수 있습니다. 사용 가능한 환경 값은 매뉴얼 페이지를 확인하십시오.
#! /bin/bash
# For this script it's advisable to use a shell, such as Bash,
# that supports a TAR_FD value greater than 9.
echo Preparing volume $TAR_VOLUME of $TAR_ARCHIVE.
name=`expr $TAR_ARCHIVE : '\(.*\)-.*'`
case $TAR_SUBCOMMAND in
-c) ;;
-d|-x|-t) test -r ${name:-$TAR_ARCHIVE}-$TAR_VOLUME || exit 1
;;
*) exit 1
esac
echo ${name:-$TAR_ARCHIVE}-$TAR_VOLUME >&$TAR_FD