解凍時にサブディレクトリを生成しないようにunzip / zipを強制する方法は?

解凍時にサブディレクトリを生成しないようにunzip / zipを強制する方法は?

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

後者が真の場合、コマンドがunzip最初のレベルのディレクトリを「無視」するように強制するにはどうすればよいですか。

例:

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/。 (上位レベル、ディレクトリ構造にはバージョン番号は含まれていません。)

/tmp/omeka/(files)

「ガベージパス」オプションが利用可能であることを知っていますが、最上位-jディレクトリ構造ではなくサブディレクトリ構造を維持したいと思います。どうすればいいですか?

答え1

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

答え2

使うヒューズディレクトリなどのアーカイブを参照できるファイルシステムです。AVFScp選択したディレクトリにファイルを抽出するために使用されます。

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

答え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

単にサブディレクトリが存在することを確認し、存在する場合はすべてをサブディレクトリから移動してから削除します。

答え4

今日参加したばかりのため、@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が言ったように、このスクリプトは強力ではありませんが、単純な場合には機能します。

役に立つことを願っています。

関連情報