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.