複数のアーカイブに保存する必要があるいくつかのディレクトリのコンテンツファイルを作成したいと思いますtar
。私は使う
du --all currentdir >> contents.list
そのような理由で。
ファイルに書き込む前に、tar
出力の各行にアーカイブ名を追加したいと思います。du
私はこれを行うことができると思います:
du --all currentdir | while read i; do echo "$i mytar" >> contents.list ; done
より簡単な解決策があると思いますが、bashスクリプトは初めてです。
答え1
このためにwhileループを使用すると、非常に遅くなります。各行の末尾に静的文字列を追加するには、次のようにしますsed
。
du --all | sed 's/$/ myArchive.tar/'
または、変数にアーカイブ名を含めたい場合(例$i
:):
du --all | sed "s/$/ $i/"
s/old/new/
old
最初の項目を置き換える sed の代替演算子ですnew
。この記号は$
行の終わりと一致するため、各行の終わりにのみs/$/foo/
追加されます。foo
答え2
通常、入力リストで操作を実行したい場合、特に作業が非常に簡単な場合は、xargs
次のように選択します。
du --all currentdir | xargs -I{} echo "{} mytar" >> contents.list
xargs
一般的にパフォーマンスが非常に優れていることがわかり、読みやすくなると思います(実装ごとに異なる可能性があり、常に直感的ではないさまざまな正規表現の重要性を覚えておく必要はありません)。
答え3
du
これに使用するのは間違ったアプローチです。代わりにtarファイルが作成されると、単にコンテンツを一覧tar tv
表示するために使用されます。例えば
for f in *.tar.gz; do
tar tvfz "$f" > "$f.list"
done
これにより、tar.gz ファイルごとに .list ファイルが生成されます。包括的なリストを生成するには、grep
次のものを使用できます。
grep -H . *.tar.gz.list > contents.list
パターンは.
何でも一致し、この-H
オプションは入力ファイル名が1つしかない場合でも出力にファイル名とコロン接頭辞を追加するようにgrepに指示します(デフォルトでは、grepは入力ファイルが複数ある場合にのみこれを行います)。 。