目的:
a.zip
unzip
onコマンドを使用してアーカイブを展開し、展開したUbuntu 12.10
フォルダの名前を変数a.zip
に割り当てます。bash
v
a.zip
複数のフォルダではなく単一のフォルダへの拡張を想定して保証します。
例:
unzip a.zip
フォルダに展開された場合は返す必要があります./foo/
。echo $v
foo
私の環境:
GNU/Linux (kernel 3.5.0-25-generic)
Ubuntu 12.10
bash v4.2.37(1)-release
UnZip 6.00 of 20 April 2009, by Debian. Original by Info-ZIP.
私の現在のソリューションは不幸with:Expand via unzip -d bar a.zip
thenはv=$(ls -1 bar)
正しい結果を提供しますが、ファイルシステムを混乱させます。
答え1
ここにあります:
v=$(unzip a.zip | grep -m1 'creating:' | cut -d' ' -f5-)
説明する
$(...)
キャプチャシェルです。その中のコマンドの出力をキャプチャして変数のように置き換えます。- コマンドの出力は
unzip
にパイプされてgrep
引数が渡され、-m1
最初の結果のみが返され、creating:
ディレクトリが生成されたときにstdoutに印刷されるテキストの一部であるtextが返されます。パイプで接続された stdout で印刷します。unzip
grep
creating: foo/
cut
cut
2番目の列の後のすべての列を印刷するために使用されます(スペースで区切られています)。単語creating:
の前にスペースがあるため、5から行末までを指定します。ディレクトリ名にスペースが含まれている場合は、行の最後まですべての列を使用しようとします。最終出力はfoo/
。
答え2
unzip -l
アーカイブの内容をリストし、出力を解析するために使用できます。- あるいは、ディレクトリをリストし、ディレクトリを再リストするアーカイブを抽出し、次を使用して両方のリストを比較することもできます。
diff
答え3
これAVFS/path/to/foo.zip
ファイルシステムは、各アーカイブファイルがディレクトリにアクセスできるファイルシステムビューを提供します~/.avfs/path/to/foo.zip#
。
mountavfs
ls ~/.avfs$PWD/foo.zip\#
ls
コマンドが単一のディレクトリを表示している場合は、zipファイルを解凍すると、そのディレクトリとその下にファイルが作成されます。 zipファイルはこのように構成されていても構成されていない場合があります。
dir
以下は、仮定を確認し、該当する場合にディレクトリ名を設定するコードの断片です。警告:zipファイルに名前.
(ドットファイル)で始まるファイルが含まれている場合、そのファイルは無視されます。
zip_directory_name () {
case $1 in
/*) ;;
*) set "$PWD/$1";;
esac
cd ~/.avfs${1}\# || exit 2
set -- *
if [ $# -eq 1 ] && [ -d "$1" ]; then
printf %s "$1"
else
return 1 # more than one top-level file, or a single non-directory
fi
}
dir=$(zip_directory_name foo.zip) || exit $?
答え4
必要に応じて解決策に不満があるかもしれませんが、実際には正しい解決策です。
d="`mktemp -d`"
unzip -d "$d" "$zipfile"
v="`basename "$d"/*`"
mv "$d"/"$v" "$v"
rmdir "$d"
echo "$v"
これは冗長ですが、zipファイルに実際にディレクトリが1つしかない限り(おそらく最初に確認する必要がある)、信頼できます。
ls
そしてgrep
出力がどのように見えるかによって異なりますので、それほど信頼できません。他のロケールでは "creating:" 文字列がない可能性があります。次のバージョンの解凍では、何らかの理由で変更される可能性があります。