Rozpakować plik do katalogu docelowego?

4

Mam plik o nazwie All CRGs.zipi chcę rozpakować jego zawartość do katalogu o nazwie data(który już istnieje i zawiera kilka innych plików).

czy to możliwe? Pracuję na OSX.

Próbowałem:

$ unzip "All CRGs.zip" -d data/

Ale to rozpina wszystko, na data/All CRGsco nie jest to, czego szukam. Chciałbym, żeby wszystko poszło od razu data.

czy to możliwe?

Richard
źródło
Jestem pewien, że łatwiej byłoby po prostu kliknąć go dwukrotnie, pozwolić mu wyodrębnić go do domyślnej lokalizacji [zwykle tuż obok .zip], a następnie przeciągnąć zawartość do nowej lokalizacji.
Tetsujin,
Tak, ale to nie moje pytanie :)
Richard

Odpowiedzi:

3

Możesz albo odtworzyć całą strukturę folderów, w tym folder All CRGs-Folder, albo możesz pominąć wszystkie foldery w pliku ZIP, używając opcji -j-flag dla polecenia unzip.

Problem polega na tym, że plik ZIP został utworzony przy użyciu opcji All CRGs-Folder jako najwyższego poziomu zip "All CRGs.zip" "All CRGs". Byłby właściwy sposób, zip "All CRGs.zip" "All CRGs/*"który utworzyłby archiwum ZIP wszystkich plików i folderów w All CRGsfolderze bez otaczającego folderu.

Tak więc jedynym sposobem na wyodrębnienie tylko plików przez zachowanie struktury folderów byłoby coś takiego:

unzip "All CRGs.zip" -d data/ && mv "data/All CRGs/*" "data/" && rmdir "data/All CRGs"

Rozpakuje pełny folder, a następnie przeniesie zawartość folderu o jeden poziom w górę i ostatecznie usunie (teraz pusty) folder „Wszystkie CRG”.

heiglandreas
źródło
„Właściwy sposób byłby…” nie zgadza się z moimi oczekiwaniami. Próbowałem utworzyć plik zip przy użyciu tej składni i otrzymuję komunikat „nazwa nie pasuje”. Jeśli wyjmę All CRGs/*z cudzysłowu, pliki zostaną dodane do zip, ale z obecnym katalogiem nadrzędnym.
Jason R. Coombs
Od czasu odpowiedzi na to pytanie pojawiły się co najmniej 2 nowe wersje OS-X (macOS). Więc mogła nastąpić zmiana. W jakiej wersji systemu macOS pracujesz?
heiglandreas
Słuszna uwaga. 10.12.5 jest najnowszą wersją i wersją, której używałem w momencie tego komentarza.
Jason R. Coombs
mvkomenda nie ruszy ukryte pliki. mv "data/All CRGs/.*" "data/"wymagana jest dodatkowa .
Kinjal Dixit,
2

Ponieważ wiesz, że plik zip zawiera niechciany folder najwyższego poziomu, a ponieważ znasz nazwę tego folderu najwyższego poziomu, możesz użyć dowiązania symbolicznego, aby cała zawartość tego folderu pojawiła się w obiekcie nadrzędnym w następujący sposób:

ln -s . 'data/All CRGs'
unzip 'All CRGs.zip' -d data

Ten lnkrok powoduje utworzenie folderu, data/All CRGsktóry prowadzi do bieżącego katalogu (względem data/), czyli data/. Następnie, gdy rozpakujesz pliki All CRGs.zipi unzippolecenie spróbuje utworzyć data/All CRGs/file.dat, plik zostanie utworzony jako data/./file.dat.

Tę technikę można zademonstrować bez pliku zip za pomocą dotyku:

$ mkdir data
$ ln -s . data/subdir     
$ touch data/subdir/foo.txt
$ ls data
foo.txt subdir

Możesz także użyć tej sztuczki, aby wyodrębnić niektóre pliki lub foldery do alternatywnego folderu:

ln -s /tmp data/subdir2

Wtedy wszystko w rozpakowywanym archiwum subdir2pojawi się w /tmp.

Jason R. Coombs
źródło