Spakuj archiwum bez dołączania katalogu nadrzędnego


30

Chcę skompresować wiele folderów w drzewie katalogów

V-
 something.txt
 folder
 folder
 g.jpg
 h.jar

Kiedy próbuję go skompresować, kończy się tworzenie archiwum zip z folderem v zamiast jego zawartości (podkatalogów i plików)

Jak mogę tego uniknąć?

Odpowiedzi:


23

Więc jeśli dobrze rozumiem, próbujesz zarchiwizować pliki i foldery w określonym folderze, ale bez uwzględnienia folderu głównego.

Przykład:

/test/test.txt
/test/test2.txt

gdzie test.txt i test2.txt byłyby przechowywane w zipie, ale nie / test /

Możesz cd do katalogu / test /, a następnie uruchomić coś takiego,

zip -r filename.zip ./*

Który utworzyłby archiwum w tym samym folderze o nazwie nazwa_pliku.zip. Lub jeśli uruchamiasz go spoza folderu, możesz uruchomić,

zip -r test.zip test/*

/ * To część, która zawiera tylko zawartość folderu, a nie cały folder.

Edycja: OP chciał wielu zamków, rozwiązanie okazało się trochę hackem, jestem ciekawy, czy istnieje lepszy sposób na zrobienie tego.

for d in */ ; do base=$(basename "$d") ; cd $base ; zip -r $base * ; mv "${base}.zip" .. ; cd .. ; done;

tak, ale mam dużo plików, na których robię to samo, więc byłoby to żmudne, więc jest to jak skrypt bash lub coś, co zautomatyzuje ten sam proces w katalogu, który ma wszystkie foldery
Dami

1
Ok, uruchomiłem skrypt i utworzyłem katalog nadrzędny w archiwum. Chcę tylko zawartość folderu w archiwum
Dami,

1
mój błąd, trochę tego przegapiłem. dodano parametr -j, który właśnie sprawdziłem, najwyraźniej pomija część, której nie chcesz. spróbuj tego:for d in */ ; do base=$(basename "$d") ; zip -rj "${base}.zip" "$d" ; done;
zzbomb,

18
zip -r test.zip test / * z zewnątrz dodaje test jako katalog do pliku zip
smihael

4
jak stwierdził @smihael, zip -r test.zip test/*nie działa. czy jest jakiś właściwy sposób, aby to osiągnąć spoza katalogu?
andrhamm

22

Użyj opcji -jlub --junk-pathsw poleceniu zip.

Ze strony podręcznika zip :

-j

--junk-paths

Store just the name of a saved file (junk the path), and do not store directory 
names. By default, zip will store the full path (relative to the current 
directory).

To wydaje się być poprawna odpowiedź.
mutant_city

3
A co z zagnieżdżonymi ścieżkami / folderami?
GuyPaddock

3
Pominie to wszystkie foldery w archiwum, a jeśli masz duplikaty nazw plików w różnych folderach, to wybuchnie. Ma to swoje miejsce, ale tylko wtedy, gdy nie przejmujesz się folderami i chcesz tylko plików. Nie to, o co prosił PO, ale wciąż dobra wiedza
Govind Rai

17

Co powiesz na to polecenie?

$ cd somedir ; zip -r ../zipped.zip . * ; cd ..

5
Chociaż jest to poprawna odpowiedź, wprowadzenie nie brzmi, jakbyś był przekonany. Pomogłoby to również trochę wyjaśnić, co robi polecenie.
Nephente

1
To też było moje rozwiązanie, ale nie podoba mi się to, ponieważ wymaga cd. Miałem nadzieję, że istnieje sposób na dokładniejsze określenie zapisanej ścieżki.
nilskp

3

Mam nadzieję że to pomoże.

(cd directory && zip -r ../out.zip .)

Utrzymuje główną powłokę w tym samym katalogu i zmienia tylko katalog podpowłoki, która umiera po wydaniu polecenia.


Chciałem dodać to jako komentarz do odpowiedzi @Alfred UC , ale nie mam na to wystarczającej reputacji.
Kenneth

Jeśli faktycznie rozwiązuje problem, może to być rozwiązanie.
Yufenyuy Veyeh Dider

To jest lepsza odpowiedź. Czy działa to zarówno w bash, jak i sh?
Arlen Beiler
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.