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


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.