Распаковать в каталог, независимо от того, содержится ли каталог в ZIP-архиве

Распаковать в каталог, независимо от того, содержится ли каталог в ZIP-архиве

Предположим, у меня есть ZIP-файл, содержимое которого может выглядеть так:

# file: with_out_dir.zip
file1.txt
file2.cpp
file3.js
some_sub_dir/
- file_in_subdir.txt
file4.xml

но это также может выглядеть так

# file: with_dir.zip
archive/
- file1.txt
- file2.cpp
- file3.js
- some_sub_dir/
-- file_in_subdir.txt
- file4.xml

и теперь я хотел бы, чтобы мой bash-скрипт извлек эти файлы, но в любом случае его нужно извлечь, /var/sample/поэтому он будет выглядеть так:

# expected output
/var/
- sample/
-- file1.txt
-- file2.cpp
-- file3.js
-- some_sub_dir/
--- file_in_subdir.txt
-- file4.xml

Как лучше всего это сделать с помощью bashскрипта?

В данный момент я использую unzipдля распаковки zip-файлов, но я открыт для любого другого инструмента командной строки, если его будет проще использовать.

решение1

Я бы предложил просто:

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

Кстати, создание архива (tar, zip, что угодно)безиметь всех членов архива внутри подкаталога - этоЗЛО. Я не знаю, почему люди это делают!

решение2

Существует несколько интеллектуальных инструментов извлечения (о которых я узнал после того, как написал один для себя). Вы можете взглянуть на dtrx(установить с помощью sudo apt-get install dtrx).

dtrx всегдасоздает каталог верхнего уровня, если его еще нет в архиве. Адаптация вашего скрипта оболочки bash (который вызывает dtrxвместо unzip) становится намного проще, поскольку нужно только переместить подкаталоги и удалить каталог верхнего уровня (поскольку последний всегда там).

Связанный контент