미리 정의된 볼륨 수를 사용하여 다중 볼륨(GNU) `tar` 스크립트 작성

미리 정의된 볼륨 수를 사용하여 다중 볼륨(GNU) `tar` 스크립트 작성

테스트(또는 추출)를 위해 작은 스크립트를 작성했습니다.매우대규모 다중 볼륨 tar아카이브(참고: GNU를 사용하여 생성됨 tar), 각 청크는 00x.tar표준 DVD에 맞습니다.

#!/bin/bash
d=$(dirname $0)
prf="someprefix"
last=$(ls -1 $d/*.tar | wc -l)

for i in $(eval echo {2..$last}); do echo "n $prf.00$i.tar"; done | tar -Mtvf ./$prf.001.tar --wildcards "$1"

노트:

  • tar파이프라인은 지정된 매개변수에 관계없이 작동합니다 $1.
  • d볼륨과 이 스크립트가 모두 다른 위치에 있지만 $HOME.
  • Native는 lastGNU 문제를 해결 tar하고 작업 디렉토리에서 사용 가능한 볼륨 수를 확인하지 않습니다.
  • 그렇게 큰 크기에서는 $last5(9는 고사하고)보다 거의 크지 않습니다 00.

좋아요, 작동합니다. 그러나 루프에서 완전히 벗어나는 것은심지어더 나은 것.
다음과 같습니다( --wildcards ...여기에서는 생략됨).

 eval echo -e "n\ $d/$prf.00{2..$last}.tar\\\n" | tar -Mtvf ./$prf.001.tar

그러나 이는 전체에서만 작동합니다.롤. last예를 들어 4로 설정하면 echo테스트에서 파이프를 생략하여 또 다른 문제가 발생합니다.

n someprefix.002.tar
 n someprefix.003.tar
 n someprefix.004.tar

아! 저 빈칸은 어떻게 들어왔지?tar마음에 들지 않습니다.

"수정"(매우 해킹적이긴 하지만) 은 위의 파이프에 a 를 삽입하여 sed공백을 "제외" 하는 것입니다. | sed 's/^ //'꽤 추악하지만 어쨌든 작동합니다. :)

애초에 공백을 피하는 것이 불가능합니까?

( 아마도 여기서는 좋은 해결책이 아닐 것입니다. 왜냐하면 ; 이후의 첫 번째 공백을 유지하기 위해 tr대체 문자(예: )가 필요하기 때문입니다 . 더러운 해킹을 피하기 위해 "첫 번째 공백 내용을 제외한 모든 내용을 번역"이라고 말할 수 있는 방법이 없습니다 . )§ntr

답변1

$ eval echo -e "n\ $d/$prf.00{2..$last}.tar\\\n"
n someprefix.002.tar
 n someprefix.003.tar
 n someprefix.004.tar

그 공백은 어떻게 생긴 걸까요?

간단히 말해서 대답은 다음과 같습니다. 이것은 파일 이름 확장을 사용하여 이름이 개행 문자로 끝나는 여러 파일에 한 줄을 에코할 때 얻는 출력과 유사합니다.

에서 언급했듯이버팀대 확장:

중괄호를 확장하는 패턴은 선택적 서문, 그 뒤에 일련의 쉼표로 구분된 문자열 또는 한 쌍의 중괄호 사이의 시퀀스 표현식, 그 뒤에 선택적 포스트스크립트의 형태를 취합니다.

그래서 쉘은 평가 중입니다.

echo -e n\ dir/prefix00{2..4}.tar\\n
        ^preamble^^^^^^      ^postscript

그리고 파일 이름 확장자와 마찬가지로확장된 각 요소 사이에 공백을 삽입하세요., 그래서 다음과 같은 결과를 얻습니다(명확성을 위해 여기에는 \n 이스케이프 시퀀스를 유지합니다).

n dir/prefix002.tar\n n dir/prefix003.tar\n n dir/prefix004.tar\n\n

양자 전자 장치.

tar여러 볼륨을 탐색하기 위해 스크립트에 정보를 제공하는 방법에 대한 기본 질문에 대해서는 다음 두 가지 접근 방식이 있습니다.

  • seq명령을 생성하는 데 사용됩니다 n.
    seq -f "n $d/$prf.%03g.tar" 2 $last tar -Mtvf $d/$prf.001.tar |
  • 각각의 새 볼륨 이름을 생성하고 옵션을 전달하는 짧은 스크립트를 작성 tar하십시오 --new-volume-script.
    echo '#!/bin/sh'> ./newvol
    echo "printf $d/$prf.%03d.tar \$TAR_VOLUME >&\$TAR_FD" >> ./newvol
    chmod +x ./newvol
    tar -Mtvf $d/$prf.001.tar --new-volume-script=./newvol

관련 정보