Распакуйте содержимое файла, но без создания архивной папки


37

У меня есть файл myarchive.zip, который содержит много каталогов, файлов и т. Д. Допустим, этот файл myarchive.zip находится в каталоге с именем «b». Что ж, когда я использую команду «unzip myarchive.zip», система по умолчанию создает каталог «myarchive» с содержимым zip-файла. Я не хочу, чтобы система создала этот «myarchive» каталог - я просто хочу, чтобы содержимое было извлечено в каталог «b». Это возможно?

То, что я сейчас делаю, - это просто введите команду «cp», чтобы скопировать файлы из только что созданного каталога (в данном случае «myarchive» в «b») туда, куда я хочу.


8
По умолчанию unzipне создает каталог. Ваш почтовый файл, вероятно, имеет каталог на верхнем уровне.
Крис Даун

3
Вы могли бы использовать mvвместо cp. mv archive/* .; rmdir archive/или похожие.
frostschutz

Ответы:


45

Моя версия unzipимеет -jвозможность не создавать каталоги.

Так

unzip -j /path/to/file.zip

Извлечет все файлы в текущий каталог без восстановления структуры каталога, хранящейся в zipфайле.

Если вы хотите удалить из архива только один уровень каталогов (извлекать myarchive/dir/fileкак dir/file, а не file), вы можете вместо этого использовать bsdtar(который поддерживает zipфайлы в дополнение к tarфайлам) и его -sпараметр.

bsdtar -xf /path/to/file.zip -s'|[^/]*/||'

8
При использовании -jархива структура каталогов не воссоздается и все файлы помещаются в папку извлечения. Это означает, что ВСЕ подпапки будут удалены. Так что если у вас есть zip/A/f1, zip/A/B/f2и zip/A/B/C/f3вы в конечном итоге с одной папкой с f1, f2, f3. Это становится забавным, если у вас есть файлы с одинаковыми именами в разных подпапках. Обычно вы хотите просто удалить верхнюю папку, а не всю структуру каталогов.
Кристиан Враби

3
@CristianVrabie, ну это именно то, что я говорю в ответе. Я добавил альтернативу bsdtar для того, что вы просите. Смотрите редактировать.
Стефан Шазелас


1

Что в принятом ответе не указано, как это сделать, как вы говорите в вопросе, если вы все еще хотите извлечь в определенную папку, не используя пути к папкам, хранящимся в zip-файлах, вы можете использовать -jопцию с -dопцией таким образом :

unzip -j /path/to/file.zip -d other_folder

или для вашего случая

unzip -j myarchive.zip -d b

2
Ты прав, что можешь это сделать; но он не будет создавать подкаталоги, поэтому вам все равно придется включить еще один шаг; Я почти уверен, что ОП хочет переименовать корневой каталог архива на другое имя, но оставшуюся структуру следует оставить в этом каталоге.
Прифтан

-1

Если выполнение unzip myarchive.zipсоздает каталог myarchiveсо всем в нем, то это означает, что создатель zip-файла фактически выполнил zip для этого каталога.

Единственный способ создать то, что вы хотите, это просто переместить все содержимое за пределы каталога после выполнения unzip:

[user@host]:some/path/b$ unzip myarchive.zip

[user@host]:some/path/b$ ls{ показывает каталогmyarchive }

[user@host]:some/path/b$ mv myarchive/* .

[user@host]:some/path/b$ rm -R myarchive

[user@host]:some/path/b$ ls{ показывает первый уровень myarchive (прямо в b) }


1
вам также нужно mv myarchive/.* .переместить все скрытые файлы, такие как .gitignore и .htaccess.
Кинджал Диксит,

1
@KinjalDixit Я тоже так думал; Антуан, как указывает Кинджай, в вашем примере имеет фатальный недостаток: потому что вы используете rm -Rи потому что вы не используете, ls -aвы не показываете, есть ли какие-либо точечные файлы; Теперь, что происходит, когда вы запускаете rm -Rи есть точечные файлы? Вы их не скопировали, поэтому они потерялись. Вы действительно должны это исправить и, возможно, объяснить разницу, потому что это что-то, что может запутать новичков; и подумайте: что, если это не архив у них есть? Или что, если они добавят в команду удалить архив после его распаковки?
Прифтан

Отох сначала rmdirудостоверится, что он пуст ... Но если пользователь не знает о точечных файлах, это может их запутать.
Прифтан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.