複数の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