
多くの.shファイルを含むtarアーカイブxyz.tarがあります。たとえば、次のようになります。
123.sh
456.sh
789.sh
各ファイルには、Welcome to Hollywood、I Love Hollywood、Hollywood Movies.sh
などの文字列コンテンツが含まれています。123.sh
456.sh
789.sh
.sh
今私の目標は、ループを使用してすべてのファイルでハリウッド文字列をOscarに置き換えることです。
私は次のコマンドを試しました。
for i in $(tar -xvf xyz.tar); do sed -e 's/Hollywood/Oscar/' $i; done
コマンドウィンドウに出力が表示されますが、抽出および置換コマンドの後にtarアーカイブを再圧縮できないため、o / pはxyz.tarアーカイブに反映されません。
答え1
まず、.tarファイルは通常圧縮されないことに注意してください(圧縮されている場合、.tar.gz
拡張子は.である可能性が高い.tar.xz
)。
次にtar -xvf xyz.tar
ファイルを抽出します。そして名前のリスト、sedはファイルの内容ではなくファイル名のリストに対して機能します。
代替の長さが元のファイルとまったく同じであれば、理論的には(tarファイルにチェックサムがないため)置き換えることができます.tar
。しかし、より良いアプローチは、最初に一時ディレクトリ内のすべてのファイルを抽出し、次を使用することです。
find . -name "*.sh" -print0 | xargs -0 sed -i -e 's/Hollywood/Oscar/'
その後、一時ディレクトリにtarファイルを再作成します。
これは、入力ファイルを編集内容に置き換えることをサポートするとsed
仮定します-i
。そうでない場合は、出力を呼び出して一時ファイルに書き込んでから、完了したらsed
ファイルを再コピーする小さなスクリプトを作成する必要があります。sed