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


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{ показує перший рівень мірхіву (безпосередньо в b) }


1
вам також потрібно mv myarchive/.* .перенести всі приховані файли, такі як .gitignore та .htaccess.
— Kinjal Dixit

1
@KinjalDixit Це теж було моє мислення; У вашому прикладі Антуана є фатальний недолік, як вказує Кінджай: тому що ви використовуєте rm -Rі тому, що ви не використовуєте, ls -aви не показуєте, чи є файли з крапками; тепер, що відбувається при запуску, rm -Rі є файли з крапками? Ви їх не скопіювали, щоб вони загубилися. Ви дійсно повинні це виправити і, можливо, пояснити різницю, тому що це щось, що буде подорожчати новачків досить багато; і врахуйте це: що, якщо це не архів у них? Або що робити, якщо вони додають до команди для видалення архіву, коли він не стискається?
— Прифтан

Otoh rmdirпереконається, що спочатку він порожній ... Але якщо користувач не знає про точкові файли, він би їх плутав.
— Прифтан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.