mktemp был разработан для этого. На странице руководства:
TMPFILE=`mktemp /tmp/example.XXXXXXXXXX` || exit 1
echo "program output" >> $TMPFILE
mktemp создаст файл или выйдет с ненулевым статусом выхода. Логическое или (||) гарантирует, что сценарий завершится, если mktemp не сможет создать файл. После этой команды вы можете быть уверены, что файл доступен. Нет необходимости проверять его снова. Единственное, что вам может потребоваться добавить, это очистку файла в конце вашего скрипта.
И, возможно, также, когда сценарий завершается сигналом. Вам нужно решить, нужно это или нет.
И то, и другое можно сделать с помощью команды trap
.
7z
может это сделать, по крайней мере, если корневой каталог в архиве (если какой-либо )совпадает с именем каталога, который вы извлекаете в:
7z x -spe funtool.zip -ofuntool
Если все содержимое funtool.zip
находится внутри каталога funtool
в архиве, 7z
не будет дублировать каталог ниже funtool
, что даст вам нужный результат.
В качестве интерфейса командной строки для различных форматов архивов существует unp
, распаковка (почти )всего одной командой .
И он утверждает, что имеет эти опции:
-u Special helper mode.
For most archive types:
- create directory <filename without suffix>/
- extract contents there
For Debian/Ubuntu packages:
- extract data.tar.gz after each operation in local directory
- extract control.tar.gz into control/<package_version_arch>/
-U Smart mode, acts like -u (see above) if archive contains multiple
elements but if there is only one file/directory element then it's stored
in the current directory.
И это звучит так, как будто оно близко к поведению, которое вы ищете.
Однако режим -U
по-прежнему засоряет один файл, если это ZIP с одним файлом, который никоим образом не связан с именем самого zip-файла.
Существует инструмент командной строки dtrx , который может извлекать любые сжатые файлы. По умолчанию все будет записано в специальный каталог, названный в честь архива.
Просто запустите
dtrx <archive_name>
Если у вас есть дистрибутив на основе Debian -, вы можете найти его в репозитории APT.