zipファイルには、f.zip
ディレクトリを含む複数のファイルが含まれています。
A/B
A/B/C
A/B/C/D
..
A/B/C/D/and/some/more/dirs
A/B2
今私はC / Dの下のツリーに興味があります。 A / B / Cを含むDの下のすべての項目(Dが唯一のシーケンスであると仮定)を現在のディレクトリに抽出できますが、Dがunzip f.zip */D/* -d .
解凍操作のルートディレクトリになることを望みます。もちろん、Dを現在の作業ディレクトリに移動できますが、これは不正行為だと思います。
マニュアルページやGoogleのどちらも解決策を公開していませんが、たぶん私が見落としているかもしれないし、移動よりも良い解決策があるかもしれません。
ああ、私のプラットフォームはmac os x 10.8.prettyup2dateです。
ベストアンサー1
マニュアルページを解凍すると:
-j junk paths. The archive's directory structure is not recreated;
all files are deposited in the extraction directory (by default,
the current one).
だから:
unzip -d D -j f.zip */D/*
ディレクトリ構造なしでDというフォルダにすべて抽出します(これにより、Dサブディレクトリのファイルが最上位の出力Dフォルダに抽出されます)。
編集するOPはDフォルダの下にファイル構造を保持しようとします。
unzip -l f.zip | grep 'A/B/C/D' | \
perl -ple 's/\s+\d+\s+\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}\s+(.*)$/$1/' | \
while read file
do
unzip -j -d "$(echo $file | sed 's:A/B/C/\(.*\)/.*:\1:g')" f.zip "$file"
done
各段階の部品:
unzip -l f.zip
f.zipにファイルリストをインポートする
grep 'A/B/C/D'
grep はターゲットディレクトリのファイル行を表示します。
perl -ple 's/\s+\d+\s+\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}\s+(.*)$/$1/'
Perlを使用して一致する行からファイル名を取得します(私のsed-fuはStephaneのものほど良くないので、Perlを使用します!)。ファイル名のスペースを処理します。:)
while read file
do
上記のコマンドで生成されたファイルを繰り返し、次に割り当てます。$file
unzip -j -d "$(echo $file | sed 's:A/B/C/\(.*\)/.*:\1:g')" f.zip "$file"
宛先$file
パスを破棄し、宛先ディレクトリに解凍します。
echo $file | sed 's:A/B/C/\(.*\)/.*:\1:g'
ファイル名から先行 A/B/C/ パスを削除します。 $()(a、詳細はbashを参照)で囲まれており、Command substitution
コマンドの置き換えはスペースを保存して実際に評価するために二重引用符で囲まれています$()
。 。
done
サイクルを完了します。
これは実際にA / B / Cと一致するすべてのファイルに対して解凍操作を実行します。
unzip -j -d "D" f.zip "A/B/C/D/"
unzip -j -d "D" f.zip "A/B/C/D/b"
unzip -j -d "D" f.zip "A/B/C/D/e"
unzip -j -d "D/stupid space" f.zip "A/B/C/D/stupid space/"
unzip -j -d "D/stupid space" f.zip "A/B/C/D/stupid space/b"
unzip -j -d "D/stupid space" f.zip "A/B/C/D/stupid space/e"
unzip -j -d "D/stupid space" f.zip "A/B/C/D/stupid space/d"
unzip -j -d "D/stupid space" f.zip "A/B/C/D/stupid space/c"
unzip -j -d "D/stupid space" f.zip "A/B/C/D/stupid space/a"
unzip -j -d "D" f.zip "A/B/C/D/d"
unzip -j -d "D" f.zip "A/B/C/D/f"
このコマンドを実行して既存のファイル構造に抽出する場合は、既存のファイル-o
に追加のコンテンツを追加する必要がありますoverride
(またはファイルを破壊する最初の解凍操作でメッセージが表示され、replace D/b? [y]es, [n]o, [A]ll, [N]one, [r]ename: extracting: D/b
爆発します)。そのヒントが必要な場合は、読み取りと読み取りを使用しない別のループ方法を使用する必要があります。返品空白を処理します(for $( ... )
テストが失敗します)。あなたがこれをしなければならないなら、私はそれをあなたが理解できるように練習のままにします!