Rozpakuj zawartość pliku, ale bez tworzenia folderu archiwum


37

Mam plik myarchive.zip, który zawiera wiele katalogów, plików itp. Powiedzmy, że ten plik myarchive.zip znajduje się w katalogu o nazwie „b”. Cóż, kiedy używam polecenia „unzip myarchive.zip”, system domyślnie tworzy katalog o nazwie „myarchive” z zawartością pliku zip. Ja nie chce, aby system do stworzenia tego „MojeArchiwum” katalogu - Chcę tylko zawartość być rozpakowane do katalogu „B”. czy to możliwe?

To, co robię teraz, to po prostu wydanie polecenia „cp”, aby skopiować pliki z nowo utworzonego katalogu (w tym przypadku „myarchive” do „b”) tam, gdzie chcę.


8
Domyślnie unzipnie tworzy katalogu. Twój plik zip prawdopodobnie ma katalog na najwyższym poziomie.
Chris Down,

3
Możesz użyć mvzamiast cp. mv archive/* .; rmdir archive/lub podobne.
frostschutz

Odpowiedzi:


45

Moja wersja unzipma -jopcję, aby nie tworzyć żadnego katalogu.

Więc

unzip -j /path/to/file.zip

Wyodrębni wszystkie pliki do bieżącego katalogu bez przywracania struktury katalogów zapisanych w zippliku.

Jeśli chcesz usunąć tylko jeden poziom katalogów z archiwum (wypakuj myarchive/dir/filejako dir/file, nie file), możesz użyć bsdtar(który obsługuje zippliki oprócz tarplików) zamiast tego i jego -sopcji.

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

8
Podczas korzystania -jz archiwum struktura katalogu nie jest odtwarzana, a wszystkie pliki są przechowywane w folderze rozpakowywania. Oznacza to, że WSZYSTKIE podfoldery są usuwane. Więc gdybyś miał zip/A/f1, zip/A/B/f2a zip/A/B/C/f3skończyłbyś z jednym folderem z f1, f2, f3. Robi się fajnie, jeśli masz pliki o tej samej nazwie w różnych podfolderach. Zwykle chcesz po prostu upuścić górny folder, a nie całą strukturę katalogów.
Cristian Vrabie

3
@CristianVrabie, cóż, dokładnie to mówię w odpowiedzi. Dodałem alternatywę bsdtar do tego, o co pytasz. Zobacz edycję.
Stéphane Chazelas

3

Wygląda na to, że jest to naprawdę proste z bsdtar :

bsdtar --strip-components=1 -xvf file.zip


1

Jaka odpowiedź w pytaniu nie określa, w jaki sposób zostanie zaakceptowana odpowiedź, jeśli nadal chcesz wyodrębnić do określonego folderu bez korzystania ze ścieżek folderów zapisanych w plikach zip, możesz użyć -jopcji z -dopcją w ten sposób :

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

lub w twoim przypadku

unzip -j myarchive.zip -d b

2
Masz rację, że możesz to zrobić; ale nie utworzy podkatalogów, więc nadal musisz uwzględnić kolejny krok; Jestem prawie pewien, że OP chce zmienić nazwę katalogu głównego archiwum na inną nazwę, ale pozostawiając pozostałą strukturę w tym katalogu.
Pryftan,

-1

Jeśli wykonanie unzip myarchive.zippowoduje utworzenie katalogu myarchivezawierającego wszystko, oznacza to, że twórca pliku zip faktycznie wykonał zip w tym katalogu.

Jedynym sposobem na stworzenie tego, co chcesz, jest przeniesienie całej zawartości poza katalog po wykonaniu unzip:

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

[user@host]:some/path/b$ ls{ pokazuje katalogmyarchive }

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

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

[user@host]:some/path/b$ ls{ pokazuje pierwszy poziom myarchive (bezpośrednio w b) }


1
musisz także mv myarchive/.* .przenieść wszystkie ukryte pliki, takie jak .gitignore i .htaccess.
Kinjal Dixit,

1
@KinjalDixit To też było moje myślenie; Antoine w twoim przykładzie jest fatalna wada, jak wskazuje Kinjai: ponieważ używasz rm -Ri ponieważ nie używasz ls -a, nie pokazujesz, czy są jakieś pliki kropek; co się teraz stanie, gdy uruchomisz rm -Ri są pliki kropkowe? Nie skopiowałeś ich, więc są zgubione. Naprawdę powinieneś to naprawić i może wyjaśnić różnicę, ponieważ jest to coś, co dość często potknie nowych początkujących; i zastanów się: co jeśli nie jest to archiwum, które mają? A co, jeśli dodadzą do polecenia usunięcia archiwum po rozpakowaniu?
Pryftan,

Oto upewniłby rmdirsię, że najpierw jest pusty ... Ale jeśli użytkownik nie wie o plikach kropkowych, pomyliłby je.
Pryftan,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.