разархивируйте файл, какой каталог был создан?

samba имеет режим, который создаст учетные записи "на лету". Я не уверен, связан ли Ваш вопрос с аутентифицируемым доступом на базе Windows от "новых" пользователей.

7
03.04.2013, 23:25
4 ответа

Вот:

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

Объяснение

  • $(...) оболочка получения. Это получает вывод команд в нем и заменяет ими как переменная.
  • Вывод unzip команда передается по каналу к grep, который передается аргумент -m1 заставить его возвратить только первый результат и текст creating:, который является частью текста unzip печать к stdout, когда это создает каталог. grep печать creating: foo/ к stdout, который передается по каналу cut.
  • cut используется для печати всех столбцов (разделенный пробелами) после второго. Мы указываем от 5 до конца строки хотя потому что слово creating: снабжается префиксом несколько пробелов. Мы хотим использовать все столбцы до конца строки в случае, если имя каталога имеет пробелы в нем. Окончательный результат foo/.
4
27.01.2020, 20:17
  • 1
    Спасибо! :) Мне нравится -m1 на grep и я не знал о cut печать в конец через -fN- (опускающий последнее полевое число). Вы преподавали мне что-то! Для этого-> upvote! Разве Вы не использовали всего один инструмент (например. awk) потому что 1. grep и cut более широко распространены, чем awk и 2. Вы находите то, что Вы записали более "читаемый"? Я хотел бы услышать Ваше объяснение, так как можно было придумать остроту, как so:stackoverflow.com/questions/15776352 PS: Вам не нужны кавычки, никакое разделение слова в ударе в переменное время присвоения. v=$(echo a b) совпадает с v="$(echo a b)" –  Robottinosino 04.04.2013, 03:26
  • 2
    Легче выбрать все поля до конца строки с cut чем с ним с awk. Это также более читаемо, по-моему. Та острота интересна. Я должен буду читать больше о awk. Используя кавычки в переменных присвоениях моя дурная привычка, которая следовала из текстового редактора, который окрасил текст в кавычках приятно. Кроме того, мой язык по умолчанию является C. –   04.04.2013, 16:53
  • 3
    Это - действительно хороший совет, но это кажется получением выходной папки таким образом процесс разархивации повреждений так или иначе. Существует ли способ получить произведенный dir, не повреждаясь разархивировавший процесс? –  Marcin Bobowski 02.11.2015, 23:44
  • Можно использовать unzip -l перечислить содержание архива и проанализировать вывод
  • Или можно перечислить каталог, извлечь архив, которые перечисляют каталог снова и сравнивают эти два использования списков diff
2
27.01.2020, 20:17
  • 1
    Спасибо! :) Мне нравится -m1 на grep и я не знал о cut печать в конец через -fN- (опускающий последнее полевое число). Вы преподавали мне что-то! Для этого-> upvote! Разве Вы не использовали всего один инструмент (например. awk) потому что 1. grep и cut более широко распространены, чем awk и 2. Вы находите то, что Вы записали более "читаемый"? Я хотел бы услышать Ваше объяснение, так как можно было придумать остроту, как so:stackoverflow.com/questions/15776352 PS: Вам не нужны кавычки, никакое разделение слова в ударе в переменное время присвоения. v=$(echo a b) совпадает с v="$(echo a b)" ---------Решение--------85919----121 Evan является более прямым: извлечения и синтаксические анализы имя dir.. (хотя Ваша идея хороша, и основание для решения Evan.. для этого - я - upvoting с благодарностью..) –  Robottinosino 04.04.2013, 03:27

Файловая система AVFS представляет представление файловой системы где каждый архивный файл /path/to/foo.zip доступно как каталог ~/.avfs/path/to/foo.zip#.

mountavfs
ls ~/.avfs$PWD/foo.zip\#

Если это ls управляйте показывает, что единственный каталог, затем разархивировав zip-файл создаст тот каталог и создаст файлы под ним. Действительно обратите внимание, что zip-файл может или не может быть организован этот путь.

Вот отрывок, который проверяет Ваше предположение и наборы dir к имени каталога если применимо. Предупреждение: если zip-файл содержит файлы, имя которых начинается с a . (отметьте точкой файлы), они проигнорированы.

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 $?
1
27.01.2020, 20:17

Будьте недовольны своим обходным решением, если Вам нравится, но это - на самом деле правильное решение.

d="`mktemp -d`"
unzip -d "$d" "$zipfile"
v="`basename "$d"/*`"
mv "$d"/"$v" "$v"
rmdir "$d"
echo "$v"

Это является подробным, но - пока действительно существует только один dir в zipfile, который необходимо, вероятно, проверить сначала - это надежно.

ls и grep менее надежно, потому что это зависит от того, как произведенный похож. В другой локали не может быть никакого "создания": строка. В следующей версии разархивировали, она могла быть изменена по любым причинам.

1
27.01.2020, 20:17

Теги

Похожие вопросы