ファイルを解凍してどのディレクトリを作成しますか?

ファイルを解凍してどのディレクトリを作成しますか?

目的:

a.zipunziponコマンドを使用してアーカイブを展開し、展開したUbuntu 12.10フォルダの名前を変数a.zipに割り当てます。bashv

a.zip複数のフォルダではなく単一のフォルダへの拡張を想定して保証します。

例:

unzip a.zipフォルダに展開された場合は返す必要があります./foo/echo $vfoo

私の環境:

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.zipthenはv=$(ls -1 bar)正しい結果を提供しますが、ファイルシステムを混乱させます。

答え1

ここにあります:

v=$(unzip a.zip | grep -m1 'creating:' | cut -d' ' -f5-)

説明する

  • $(...)キャプチャシェルです。その中のコマンドの出力をキャプチャして変数のように置き換えます。
  • コマンドの出力はunzipにパイプされてgrep引数が渡され、-m1最初の結果のみが返され、creating:ディレクトリが生成されたときにstdoutに印刷されるテキストの一部であるtextが返されます。パイプで接続された stdout で印刷します。unzipgrepcreating: foo/cut
  • cut2番目の列の後のすべての列を印刷するために使用されます(スペースで区切られています)。単語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:" 文字列がない可能性があります。次のバージョンの解凍では、何らかの理由で変更される可能性があります。

関連情報