У меня есть файл myarchive.zip, который содержит много каталогов, файлов и т. Д. Допустим, этот файл myarchive.zip находится в каталоге с именем «b». Что ж, когда я использую команду «unzip myarchive.zip», система по умолчанию создает каталог «myarchive» с содержимым zip-файла. Я не хочу, чтобы система создала этот «myarchive» каталог - я просто хочу, чтобы содержимое было извлечено в каталог «b». Это возможно?
То, что я сейчас делаю, - это просто введите команду «cp», чтобы скопировать файлы из только что созданного каталога (в данном случае «myarchive» в «b») туда, куда я хочу.
unzip
не создает каталог. Ваш почтовый файл, вероятно, имеет каталог на верхнем уровне.mv
вместоcp
.mv archive/* .; rmdir archive/
или похожие.Ответы:
Моя версия
unzip
имеет-j
возможность не создавать каталоги.Так
Извлечет все файлы в текущий каталог без восстановления структуры каталога, хранящейся в
zip
файле.Если вы хотите удалить из архива только один уровень каталогов (извлекать
myarchive/dir/file
какdir/file
, а неfile
), вы можете вместо этого использоватьbsdtar
(который поддерживаетzip
файлы в дополнение кtar
файлам) и его-s
параметр.источник
-j
архива структура каталогов не воссоздается и все файлы помещаются в папку извлечения. Это означает, что ВСЕ подпапки будут удалены. Так что если у вас естьzip/A/f1
,zip/A/B/f2
иzip/A/B/C/f3
вы в конечном итоге с одной папкой с f1, f2, f3. Это становится забавным, если у вас есть файлы с одинаковыми именами в разных подпапках. Обычно вы хотите просто удалить верхнюю папку, а не всю структуру каталогов.Похоже, это действительно просто с bsdtar :
bsdtar --strip-components=1 -xvf file.zip
источник
Что в принятом ответе не указано, как это сделать, как вы говорите в вопросе, если вы все еще хотите извлечь в определенную папку, не используя пути к папкам, хранящимся в zip-файлах, вы можете использовать
-j
опцию с-d
опцией таким образом :или для вашего случая
источник
Если выполнение
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
) }источник
mv myarchive/.* .
переместить все скрытые файлы, такие как .gitignore и .htaccess.rm -R
и потому что вы не используете,ls -a
вы не показываете, есть ли какие-либо точечные файлы; Теперь, что происходит, когда вы запускаетеrm -R
и есть точечные файлы? Вы их не скопировали, поэтому они потерялись. Вы действительно должны это исправить и, возможно, объяснить разницу, потому что это что-то, что может запутать новичков; и подумайте: что, если это не архив у них есть? Или что, если они добавят в команду удалить архив после его распаковки?rmdir
удостоверится, что он пуст ... Но если пользователь не знает о точечных файлах, это может их запутать.