Ну, вы могли бы просто извлечь в подкаталог без условий и избавиться от него, если он содержит только один элемент.
Но зачем идти на здравое и простое решение (любезно предоставленное ilkkachu), если можно использовать awk
? :)
sunzip ()
{
if [ $# -ne 1 ] || ! [ -f "$1" ]
then
printf '%s\n' "Expected a filename as the first (and only) argument. Aborting."
return 1
fi
extract_dir="."
# Strip the leading and trailing information about the zip file (leaving
# only the lines with filenames), then check to make sure *all* filenames
# contain a /.
# If any file doesn't contain a / (i.e. is not located in a directory or is
# a directory itself), exit with a failure code to trigger creating a new
# directory for the extraction.
if ! unzip -l "$1" | tail -n +4 | head -n -2 | awk 'BEGIN {lastprefix = ""} {if (match($4, /[^/]+/)) {prefix=substr($4, RSTART, RLENGTH); if (lastprefix != "" && prefix != lastprefix) {exit 1}; lastprefix=prefix}}'
then
extract_dir="${1%.zip}"
fi
unzip -d "$extract_dir" "$1"
}
Quick'n'dirty. Работает с unzip
v6.0 от InfoZIP.
Вы можете адаптировать его под свои нужды, например, принимать или автоматически использовать дополнительные параметры для unzip
, или использовать другое имя для подкаталога извлечения (которое в настоящее время определяется по имени файла zip
).
О, и я только что заметил, что это обходное решение правильно справляется с двумя наиболее распространенными ситуациями (1. ZIP-файл содержит один каталог с содержимым, 2. ZIP-файл содержит множество отдельных файлов и/или каталогов), но не создает подкаталог, когда корень ZIP-файла содержит несколько каталогов, но без файлов...
Edit: Fixed. Сценарий awk
теперь сохраняет первый компонент ("префикс") каждого пути, содержащегося в ZIP-файле, и прерывается, как только обнаруживает префикс, отличающийся от предыдущего. Это позволяет перехватывать как несколько файлов, так и несколько каталогов (поскольку и те, и другие могут иметь разные имена), игнорируя при этом ZIP-файлы, в которых все содержится в одном подкаталоге.
Посмотрите config.log
, он содержит подробную расшифровку того, что configure
запущен. Таким образом, вы получите подробную информацию о «проверке на pygtk»… и подробности «нет». Последние несколько строк относятся к делу; проблема начинается после строки, содержащей «проверка на pygtk».
Обычно содержимого config.log
достаточно для понимания проблемы. Если это не так, добавьте это к своему вопросу.
Мне удалось частично решить проблему, поскольку вы сказали, что configure
вызывает Python 3, а не Python 2.
Просто перейдите в папку с двоичными файлами cd /usr/bin
и измените символическую ссылку с Python 3 на Python 2, сохранив резервную копию для восстановления после завершения установки:
sudo mv python python.old
sudo ln -s python2.7 python
Затем вы можете вернуться в папку с пакетом и запустить make
для создания Dropbox. Когда вы закончите, вы должны вернуть символическую ссылку на Python 3, иначе у вас возникнут проблемы с вашей системой:
cd /usr/bin
sudo mv python.old python
Теперь вам нужно сообщить приложению Dropbox, чтобы оно не переходило по символической ссылке /usr/bin/python
, а вместо этого переходило по уже существующей символической ссылке /usr/bin/python2
. Для этого просто откройте файл /usr/bin/dropbox
в своем любимом текстовом редакторе (, используйте sudo
, иначе вы не сможете редактировать его )и измените первую строку с #!/usr/bin/python
на #!/usr/bin/python2
.
Теперь вы сможете запустить API Dropbox, набрав dropbox start
без каких-либо проблем с совместимостью.
Недавно я столкнулся с этим и обнаружил, (помимо того, что было предложено в предыдущих ответах ), что скрипт configure пытается импортировать модуль gtk , а не pygtk , как можно было ожидать.
$as_echo_n "checking for pygtk... " >&6; }
cat <<EOF | python
try:
import gtk
except:
exit(1)
else:
Обходной путь: заменить de gtk на pygtk в этой строке
sed -i 's/ gtk/ pygtk/g' nautilus-dropbox-2.10.0/configure
Я знаю, что это не та же версия пакета, что и в исходном вопросе, но поскольку сообщение об ошибке такое же, это может быть полезно для тех, кто направлен на тот же вопрос.
Я столкнулся с той же проблемой, изменение символической ссылки с точки python
на python2.7
не сработало для меня.
Мне помогло запустить следующую команду, чтобы заменить все вхождения python
на python2
в каждом файле в папке nautilus-dropbox-2.10.0
:
grep -rl python. | xargs sed -i 's/python/python2/g'
После этого я как обычно выполнил команды configure
, make
и make install
.
Я нашел эту статью во время сборки Dropbox(https://linux.dropbox.com/packages/nautilus-dropbox-2.10.0.tar.bz2)на удаленной машине с CentOS 7.
Хотя я установил pygtk с помощью yum install pygtk2 pygtk2 -devel, команда./configure по-прежнему завершается с оператором:
checking for pygtk... no
configure: error: couldn't find pygtk
Открытие командной строки python и ручной импорт gtk показывает, почему:
[user@computer ~]# python
Python 2.7.5 (default, Jun 20 2019, 20:27:34)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import gtk
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/site-packages/gtk-2.0/gtk/__init__.py", line 64, in <module>
_init()
File "/usr/lib64/python2.7/site-packages/gtk-2.0/gtk/__init__.py", line 52, in _init
_gtk.init_check()
RuntimeError: could not open display
>>>
Похоже, что для импорта gtk требуется допустимый набор DISPLAY.
Запуск сеанса ssh -с пересылкой -x (X11 -)заставляет эту часть работать.