Предположим, у меня есть 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
) становится намного проще, поскольку нужно только переместить подкаталоги и удалить каталог верхнего уровня (поскольку последний всегда там).