オプションで、gzipで圧縮されたアーカイブのファイルをアーカイブのファイル名から派生した名前の新しいディレクトリに抽出します。

オプションで、gzipで圧縮されたアーカイブのファイルをアーカイブのファイル名から派生した名前の新しいディレクトリに抽出します。

複数のXMLファイルを含む数千のgzip圧縮アーカイブを含むフォルダがあります。すべてのアーカイブファイルを繰り返し、特定のファイル名(fileofinterest.xmlなど)を持つファイルを、ディレクトリ内のgzip圧縮アーカイブを使用して生成する必要があるファイル名(拡張子tar.gzなし)にオプションで抽出するスクリプトが必要になりました。

したがって、以下はgzip圧縮アーカイブファイルを含むアーカイブディレクトリと、ビルドディレクトリと抽出されたファイルを含む望ましい出力ディレクトリの例です。

home/
├─ archives/
│  ├─ archive.20.01.tar.gz
│  ├─ archive.20.02.tar.gz
├─ extracted/
│  ├─ archive.20.01/
│  │  ├─ fileofinterest.xml
│  ├─ archive.20.02/
│  │  ├─ fileofinterest.xml

これはこれまでのコードであり、ディレクトリ生成が完全に欠落しています。

for f in ./*.tar.gz; do echo "Processing $f"; tar -x -f $f -C ../extracted/ fileofinterest.xml; done

ベストアンサー1

bash(ashまたは同様のPOSIX制限シェルではない)を使用している場合は、次のことができます。

for f in ./*.tar.gz; do
  dir="../extracted/${f/%.tar.gz}"
  mkdir -p "$dir"
  echo "Processing $f"
  tar -x -f "$f" -C "$dir" fileofinterest.xml
done

注:$dir同様の値を持っています../extracted/./archive.20.01が(審美的な側面とは別に)問題はありません。./パス内の追加のディレクトリは事実上無視されます。面倒な場合は、dir=${dir/\/.\//\/}前に追加してくださいmkdir -p

それ以外の場合は、次のものを使用できますbasename

for f in ./*.tar.gz; do
  dir="../extracted/$(basename "$f" .tar.gz)"
  mkdir -p "$dir"
  echo "Processing $f"
  tar -x -f "$f" -C "$dir" fileofinterest.xml
done

おすすめ記事