テスト(または抽出)のために小さなスクリプトを作成しました。非常に大規模なマルチボリューム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
その空白はどうなったのでしょうか?
簡単に言えば、答えは次のようになります。これは、ファイル名拡張子を使用して名前が改行文字で終わる複数のファイルに1行をエコーするときに得られる出力に似ています。
で述べたように支柱の拡張:
中括弧を拡張するパターンは、オプションの序文、その後に一連のカンマ区切り文字列、または一対の中括弧の間のシーケンス式、その後にオプションのPostScriptの形式を取ります。
だからシェルは評価中です。
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
複数のボリュームをナビゲートするためにスクリプトに情報を提供する方法に関する基本的な質問には、次の2つのアプローチがあります。
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