解凍を使用してディレクトリの一部をガベージに置き換えますか?

解凍を使用してディレクトリの一部をガベージに置き換えますか?

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 $( ... )テストが失敗します)。あなたがこれをしなければならないなら、私はそれをあなたが理解できるように練習のままにします!

おすすめ記事