Utwórz plik zip i zignoruj ​​strukturę katalogów

217

Muszę utworzyć plik zip za pomocą tego polecenia:

zip /dir/to/file/newZip /data/to/zip/data.txt

To działa, ale utworzony plik zip tworzy strukturę katalogów naśladującą katalog do surowego pliku. Jest wiele dodatkowych folderów, których nie potrzebuję.

Nie znalazłem odpowiedzi w pobieżnym spojrzeniu na stronę podręcznika lub polowanie na Google.

Jake
źródło
2
Myślałem, że to pytanie poprzedziło wszystkie inne wymiany stosów, ale niestety post superużytkownika jest w rzeczywistości starszy niż ten. Jeśli jest coś, co mogę zrobić, aby mi pomóc. To musi być dość gorąca odpowiedź, ponieważ Google nadal generuje tutaj tak duży ruch. : D
Jake

Odpowiedzi:

352

Możesz użyć -j.

-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).
Lars Kotthoff
źródło
19
Jeśli -jnie działa dla twojego katalogu (wraz z -r)
sprawdź
czasami po prostu nie działa ... wolę link @czerasz;) co w zasadzie jest kombinacją pushd popd
TecHunter
36

Korzystanie -jnie będzie działać razem z -ropcją.
A więc obejście tego może być następujące:

cd path/to/parent/dir/;
zip -r complete/path/to/name.zip ./* ;
cd -;

Lub wersja liniowa

cd path/to/parent/dir/ && zip -r complete/path/to/name.zip ./* && cd -

możesz skierować dane wyjściowe, /dev/nulljeśli nie chcesz, cd -aby były wyświetlane na ekranie

Vikas Tawniya
źródło
W rzeczywistości możesz wykonać następujące czynności:cd path/to/parent/dir/ && zip -r ../../../../name.zip ./* && cd -
eddyP23
@ eddyP23 Jak to robi różnicę? Raczej spowoduje to dodanie nie. z parentDir (..) dla każdego katalogu w ścieżce: |
Vikas Tawniya
Zgadzam się, że wynik jest taki sam. Ale w skryptach automatycznych, które działają w wielu różnych środowiskach, zwykle unikasz ścieżek globalnych, ponieważ nie masz pojęcia, jaka będzie ścieżka globalna. Ale z tego cd path/to/parent/dir/można łatwo obliczyć liczbę podwójnych kropek ../.
eddyP23
@ eddyP23 ma sens
Vikas Tawniya
33

Użyj -jopcji:

   -j     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 path).
Dan D.
źródło
18

Nieco powiązane - szukałem rozwiązania, które zrobiłoby to samo dla katalogów. Niestety -jopcja nie działa w tym przypadku :(

Oto dobre rozwiązanie, jak to zrobić: /superuser/119649/avoid-unwanted-path-in-zip-file

łuskowaty
źródło
3

Alternatywnie możesz utworzyć tymczasowy symboliczny link do swojego pliku:

ln -s /data/to/zip/data.txt data.txt
zip /dir/to/file/newZip !$
rm !$

Działa to również w przypadku katalogu.

MirkoBanchi
źródło
1

Zachowaj katalog nadrzędny, aby unzipnie wyrzucać plików wszędzie

Podczas kompresowania katalogów utrzymanie katalogu nadrzędnego w archiwum pomoże uniknąć zaśmiecania bieżącego katalogu, gdy później rozpakujesz plik archiwum

Aby uniknąć zachowywania wszystkich ścieżek, a ponieważ nie można jednocześnie używać opcji -j i -r (pojawi się błąd), można to zrobić w ten sposób:

cd path/to/parent/dir/;
zip -r ../my.zip ../$(basename $PWD)
cd -;

To ../$(basename $PWD)magia, która zachowuje katalog nadrzędny.

Teraz unzip my.zippodamy folder zawierający wszystkie twoje pliki:

parent-directory
├── file1
├── file2
├── dir1
│   ├── file3
│   ├── file4

Zamiast zaśmiecać bieżący katalog rozpakowanymi plikami:

file1
file2
dir1
├── file3
├── file4
AndrewD
źródło
0

Wystarczy użyć -jrmopcji, aby usunąć struktury plików i katalogów

zip -jrm /path/to/file.zip /path/to/file
Qader Dorosti
źródło
bądź ostrożny, -m --move Przenieś określone pliki do archiwum zip; w rzeczywistości powoduje to usunięcie docelowych katalogów / plików po utworzeniu określonego archiwum zip. Jeśli katalog zostanie pusty po usunięciu plików, katalog zostanie również usunięty. Nie są usuwane, dopóki zip nie utworzy archiwum bez błędów. Jest to przydatne do oszczędzania miejsca na dysku, ale jest potencjalnie niebezpieczne, dlatego zaleca się użycie go w połączeniu z -T do przetestowania archiwum przed usunięciem wszystkich plików wejściowych.
catalint