테스트(또는 추출)를 위해 작은 스크립트를 작성했습니다.매우대규모 다중 볼륨 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는
last
GNU 문제를 해결tar
하고 작업 디렉토리에서 사용 가능한 볼륨 수를 확인하지 않습니다. - 그렇게 큰 크기에서는
$last
5(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
대체 문자(예: )가 필요하기 때문입니다 . 더러운 해킹을 피하기 위해 "첫 번째 공백 내용을 제외한 모든 내용을 번역"이라고 말할 수 있는 방법이 없습니다 . )§
n
tr
답변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