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.



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).

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


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).


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.


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

0

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

zip -jrm /path/to/file.zip /path/to/file

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
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.