
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
答え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が言ったように、このスクリプトは強力ではありませんが、単純な場合には機能します。
役に立つことを願っています。