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ąć?

Dami
źródło

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;
zzbomb
źródło
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).
robrtsql
źródło
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 ..
aluc
źródło
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.

Kenneth
źródło
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