解凍時にサブディレクトリを作成しないようにunzip / zipを強制するにはどうすればよいですか?


19

zipファイルの作成方法によっては、すべてのファイルを直接抽出する場合と、サブディレクトリにファイルを抽出する場合があります。

後者が当てはまる場合、どうすれば強制的に unzipコマンドにその第1レベルのディレクトリを「無視」さますか?

例:

cd /tmp
wget http://omeka.org/files/omeka-1.5.1.zip
mkdir omeka
unzip omeka-1.5.1.zip -d omeka/
cd omeka/
ll

私が得ているのは/tmp/omeka/omeka-1.5.1/

total 12
drwxr-xr-x 3 root root 4096 2012-05-08 18:44 ./
drwxrwxrwt 6 root root 4096 2012-05-08 18:44 ../
drwxr-xr-x 5 root root 4096 2012-04-20 14:54 omeka-1.5.1/

私が欲しいのは、に抽出されたファイルです/tmp/omeka/(1レベル上にあり、ディレクトリ構造にバージョン番号が含まれていません)

/tmp/omeka/(files)

-j「パスをジャンク」するオプションを使用できることは知っていますが、最上位のディレクトリ構造だけではなく、サブディレクトリ構造を保持したいです。これどうやってするの?


ps:mvファイルを抽出してから抽出できることは承知していますが、unzipコマンドからすぐにこれを行う方法があるかどうかを確認したいと考えていました
cwd

私はそれを知りません。ただし、ファイル名が(拡張子を除いて)ディレクトリ名と常に一致する場合、抽出されたディレクトリの名前変更をスクリプト化するのは非常に簡単です。
マット

3
あなたがやろうとしていることはわかりますが、お勧めしません。プロジェクトのソースからバージョン番号を取り除くことは悪い考えです。バージョン情報のない短い名前が必要な場合は、通常どおりに抽出してln -sを使用するだけです。これにより、実行しているバージョンを常に把握し、リンクを切り替えることで新しいバージョンに簡単に更新できます。
バートンサモグラード

@BurtonSamograd-それは理想的ですが、Wordpressを例に取って、すべてのバージョンを/wordpress/zipファイル内のディレクトリ(バージョン番号なし)に入れるソフトウェアがあるため、これを行う効果的な方法があるかどうかはまだ興味があります。それは確かに素晴らしいですunzipし、次にmvこれのない制御を有していないし、いつも私の神経はほとんど乗った二つのステップでそれを行うに持ちます。幸いなことに、Wordpressにも.tar.gzフレーバーがあります:)
cwd

試してくださいcd /tmp/omeka && ln -s -T . omeka-1.5.1
ジェームズヤングマン

回答:


4

使用FUSEの次のようなディレクトリなどのアーカイブ閲覧することを可能にするファイルシステムAVFSをcp選択したディレクトリにファイルを抽出するために使用します。

mountavfs
cp -Rp ~/.avfs/tmp/omeka-1.5.1.zip\#/omeka-1.5.1 omeka

アーカイブには単一のトップレベルディレクトリがあると想定しているため、これを次のように短縮できます。

cp -Rp ~/.avfs/tmp/omeka-1.5.1.zip\#/* omeka

@Gilesはあなたが来て、他の誰も答えられないすべての質問に答える専門家ですから、これが本当にこれを行う唯一の方法だと思います。他のユーティリティをインストールしなくても使用できるunzipように*/*、抽出するファイルを指定するなど、これを行うための魔法があればいいのにと思っていましたが、そうではないと思います。ありがとう。+1
cwd

6

zipファイルにディレクトリ構造が含まれていない場合、または保存する必要がない場合は、これを使用できます。

cd /tmp
wget http://omeka.org/files/omeka-1.5.1.zip
unzip -j omeka-1.5.1.zip -d omeka
cd omeka
ll

3

このスクリプトは堅牢ではありませんが、単純な場合に機能します。

...
dest=omeka
unzip omeka-1.5.1.zip -d $dest/

if [ `ls $dest | wc -l` == 1 ]; then
  subdir=`ls $dest`
  mv $dest/$subdir/* $dest/
  rmdir $dest/$subdir
fi

サブディレクトリが1つだけであるかどうかを確認し、ある場合は、すべてのサブディレクトリを上に移動してから削除します。


2

今日登録したばかりなので、@ SteveBennetの回答に投票することはできず、コメントを追加することもできません。

彼の答えに基づいて、次のような再帰関数を作成しました。

...

shopt -s dotglob # To include hidden files in the move command

function moveSub {
  local dest=$1
  if [ `ls $dest | wc -l` == 1 ]; then
    local subdir=`ls $dest`
    moveSub "$dest/$subdir"
    mv $dest/$subdir/* $dest/
    rmdir $dest/$subdir
  fi
}

moveSub "$dest"

@SteveBennetが言ったように、このスクリプトは堅牢ではありませんが、単純なケースでは機能します。

役に立てば幸いです。


1

必要性のように見える patch --strip=nオプションの

開始時にパスコンポーネントを切り取るpatch --strip=number(または-pnumber)のようなオプションがあることが望ましいでしょうnumber(参照:ファイルの比較とマージ:パッチディレクトリ)。

その他のソリューション、適用性

それに失敗すると、別の解決策があります。ハッキングのようなものですが、機能します。私の場合、最初に完全なzipを抽出せずに、既存のファイルでいっぱいのディレクトリをzipのコンテンツで上書きしたかったのです。

このソリューションが機能し、@ Gillesのソリューションが利用可能な場合、後者も機能します。しかし、このソリューションでは、FUSEファイルシステムの可用性は必要ありません。

どうやってするの

追加のディレクトリを知っていると仮定すると、あなたの場合omeka-1.5.1、これを行うことができます:

mkdir omeka
ln -s . omeka/omeka-1.5.1 # create a symlink that redirects output
unzip omeka-1.5.1.zip -d omeka/
rm omeka/omeka-1.5.1 # remote symlink

unzipomeka-1.5.1は、実際にdirを含むへのシンボリックリンクに解凍しようとします。その結果、ファイルはomeka直接届きます。

可能なバリエーション

depeer階層の1つ以上の部分をリダイレクトするバリアントを想像できます。

ln -s ../myfoo omeka/omeka-1.5.1/foo
ln -s ../../mybarxyzzy omeka/omeka-1.5.1/subdir/bar

結論

このソリューションはある程度具体的ですが、使用例があり、たまたま使用しました。


あなたがパスを知っていれば素晴らしい解決策です!
grepsedawk

zipコンテンツを最初にリストすることで、たとえばを使用してパスをプローブできますunzip -l。これは、一般的なパスの一部を把握するスクリプトを使用して自動化することもできます。
ステファンゴーリション

ああ、完全に、あなたが道を知っているならば、それはたやすくトンです。unzip -lを少し試してみましたが、grep / sed / awkが意図したものより少し多かったため、バックアウトしました。
grepsedawk

zipinfo -1良いスタートかもしれません。あなたのユースケースは何ですか?
ステフェイン・グーリッホン

github.com/grepsedawk/wow-config/blob/…この場合、ディレクトリを知っています:)
grepsedawk

1

ほとんどunzip-j場合、次のようにオプションを使用して実行する必要があります。

unzip -j files.zip -d ./output/

しかし、その動作に驚くかもしれません:

-jジャンクパス。アーカイブのディレクトリ構造は再作成されません。すべてのファイルは抽出ディレクトリに保存されます(デフォルトでは、現在のファイル)。

files.zip出力ディレクトリで抽出し./output、結果としてこれを取得する場合:

./output/files/subfolder1/f1
./output/files/subfolder1/f2

その後、-jオプションは、(すべてのパスがストライピング)あなたにこれを与えます:

./output/f1
./output/f2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.