du や ls -l など、複数行を返す bash コマンドの各行に文字列を追加する方法

du や ls -l など、複数行を返す bash コマンドの各行に文字列を追加する方法

複数のアーカイブに保存する必要があるいくつかのディレクトリのコンテンツファイルを作成したいと思います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は入力ファイルが複数ある場合にのみこれを行います)。 。

関連情報