事前定義されたボリューム数を使用したマルチボリューム(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

その空白はどうなったのでしょうか?

簡単に言えば、答えは次のようになります。これは、ファイル名拡張子を使用して名前が改行文字で終わる複数のファイルに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

おすすめ記事