Jak mogę utworzyć archiwum zip całego katalogu przez terminal bez ukrytych plików?

220

Mam projekt z dużą ilością ukrytych folderów / plików. Chcę utworzyć archiwum zip, ale w archiwum nie powinny znajdować się żadne ukryte foldery / pliki. Jeśli pliki w ukrytym folderze nie są ukryte, nie należy ich również dołączać.

Wiem, że mogę utworzyć archiwum zip takiego katalogu:

zip -r zipfile.zip directory

Wiem też, że mogę wykluczyć pliki z opcją -x, więc pomyślałem, że to może działać:

zip -r zipfile.zip directory -x .*

Nie działało. Wszystkie ukryte katalogi nadal znajdowały się w pliku zip.

Martin Thoma
źródło

Odpowiedzi:

107

Wyklucza to również ukryte pliki w niejawnych katalogach:

find /full_path -path '*/.*' -prune -o -type f -print | zip ~/file.zip -@
zorganizować
źródło
2
Dzięki za odpowiedź. Polecenie ( find community-chess/ -path '*/.*' -prune -o -type f -print | zip ~/community-chess.zip -@) jest dłuższe niż oczekiwano, ale działa dobrze. Uwzględniono także podkatalogi, więc +1 i zaakceptowana odpowiedź :-)
Martin Thoma
104

Przede wszystkim, jeśli nie masz zainstalowanego zip, zainstaluj go najpierw w następujący sposób:

sudo apt-get install zip

Następnie, aby po prostu utworzyć plik zip:

zip -r compressed_filename.zip foldername

Jeśli chcesz wykluczyć ukryte pliki:

find /folder_path -path '*/.*' -prune -o -type f -print | zip ~/compressed_filename.zip -@

Wykluczanie plików z archiwum Zip (pobrane z http://osxdaily.com/2013/04/30/how-to-exclude-files-from-a-zip-archive/ )

Podstawy wykluczania plików podczas tworzenia archiwum zip są wyśrodkowane wokół -xflagi, która służy do wykluczania plików z archiwum, które pasują do określonej nazwy lub wzorca. W najbardziej podstawowej formie będzie to wyglądać tak:

zip archive.zip files -x "ExcludeMe"

Oznacza to, że możesz wykluczyć pojedynczy plik, powiedzmy, że ma on nazwę „Nothanks.jpg”

zip archive.zip images/ -x "Nothanks.jpg"

Omówmy kilka konkretnych przykładów, w których jest to przydatne.

Wyklucz pliki .DS_Store z archiwów Zip

Zapobiegnie to włączeniu zazwyczaj niewidocznych .DS_Store plików metadanych Mac do archiwum zip, które są domyślnie zawarte w pakiecie:

zip -r archivename.zip archivedirectory -x "*.DS_Store"

Jeśli jednak katalog zawiera podkatalogi, możesz użyć innej odmiany tej komendy, aby wykluczyć również pliki ds_store z podkatalogów:

zip -r archive.zip directory -x "*/\.DS_Store"

Uwaga: nie wszystkie powłoki wymagają cudzysłowów, aby to polecenie działało poprawnie, ale w powłoce bash (domyślnej dla OS X) będziesz musiał użyć cudzysłowów do wykluczania ze znakami wieloznacznymi i wzorami.

Wyklucz określone typy plików z archiwum Zip

Za pomocą symboli wieloznacznych można również wykluczyć wszystkie pliki określonego typu, koncentrując się na rozszerzeniu. Na przykład to polecenie spakuje cały katalog, pomijając wszelkie .jpgpliki:

zip -r archive.zip directory -x "*.jpg"

Można to zmodyfikować dla dowolnego określonego rozszerzenia pliku lub wzorca dopasowanego do nazwy pliku.

Wyklucz katalog .git lub .svn z archiwum Zip

Spakuj katalog minus .giti jego zawartość:

zip -r zipdir.zip directorytozip -x "*.git*"

Zip folder, bez .svnkatalogu:

zip -r zipped.zip directory -x "*.svn*"

Wyklucz wszystkie ukryte pliki z archiwum Zip

Ponieważ można używać wzorców i symboli wieloznacznych, można również wykluczyć dowolne lub wszystkie niewidoczne pliki i foldery, które są tworzone przez poprzedzenie kropką, niezależnie od tego, czy jest to katalog podobny, .svnczy pojedynczy plik, taki jak .bash_profilelub .htaccess.

zip -r archivename.zip directorytozip -x "*.*"

Lub, aby wykluczyć wszystkie niewidoczne pliki ze wszystkich podkatalogów:

zip -r archive.zip directory -x "*/\.*"
MAK Ripon
źródło
5
Dziękujemy za twój wysiłek, aby pomóc innym użytkownikom Ubuntu. Należy pamiętać, że powtórzenie zaakceptowanej odpowiedzi w nowej odpowiedzi tylko dodaje bałaganu i ma duże prawdopodobieństwo, że zostanie oznaczony do usunięcia.
hmayag
54

Dodaj "do .*(w przeciwnym razie powłoka rozwija się .*do plików kropek w bieżącym katalogu), a także wyklucza ukryte pliki w podkatalogach:

zip -r zipfile.zip . -x ".*" -x "*/.*"

Spowoduje to, że pliki zaczynające się od .nie będą dodawane do pliku zip.

rinzwind@discworld:~/tmp$ ls -la
drwxr-xr-x  2 rinzwind rinzwind 4096 2011-08-28 00:15 tmp
drwxr-xr-x  2 rinzwind rinzwind 4096 2011-08-28 00:15 .tmp
rinzwind@discworld:~/tmp$ zip -r zipfile.zip . -x .*
adding: .tmp/ (stored 0%)
adding: tmp/ (stored 0%)
rinzwind@discworld:~/tmp$ zip -r zipfile.zip . -x ".*" -x "*/.*"
updating: tmp/ (stored 0%)
Rinzwind
źródło
1
Nie sądzę, aby twoje ostatnie stwierdzenie było prawidłowe. .*zostałby rozszerzony przez powłokę.
hammar
1
Myślę, że prawdopodobnie będzie to poprawne, ale usunąłem (nie jestem pewien) :)
Rinzwind
to nie zadziałało. Dodano katalogi .svn
Martin Thoma,
1
@moose wykluczyć wzorzec pasuje pełną ścieżkę, a nie tylko nazwa baza plików, więc trzeba wykluczyć */.*, jak również .*( */dopasowuje dowolny niepusty ciąg katalogów).
Gilles
Działa to bez zmiany niczego! Najlepsza odpowiedź.
Whitecat
8

Ten zawiera wszystkie „.” katalogi, podkatalogi i „.” pliki lub katalogi w katalogach ... Zasadniczo pierwsza odpowiedź, ale zawiera najwyższy poziom „.” akta.

find /full_path -path '*.*/.*' -prune -o -type f -print | zip ~/file.zip -@
Cosimnot
źródło
8

Przykład wykluczenia wszystkich folderów zaczynających się od. :

tar cvpzf folder.tgz folder/ --exclude '.*'

Lepszy kompres, ale wolniejszy:

tar cvpjf folder.tar.bz2 folder/ --exclude '.*'
Tigrouzen
źródło
5

Prawidłowa metoda to:

zip -r zipfile.zip directory -x directory/.*
Rômulo Neves
źródło
@downvoter: Co się stało, wydaje się, że to działa dla mnie.
praca w
Ten sam problem jak w oryginalnej odpowiedzi Rinzwinda (teraz poprawionej): nie wykluczasz podkatalogów. I jak zauważył Rinzwind, musisz zacytować symbole wieloznaczne, w przeciwnym razie powłoka je rozszerzy.
Gilles
4

Podczas kompresowania katalogów z wyłączeniem niektórych rozszerzeń plików:

$ cd /path/to/dir
$ zip -r dir.zip . -x "*.log" -x "*.cache"
K-Gun
źródło
3

Bez ukrytych folderów i plików w katalogu:

zip -r zipfile.zip directory/*

informator: |── .git │   ├── src │   └── Work.file ├── .test │   └── .file └── test.file

$ zip -r zipfile.zip directory/*
adding: directory/src/ (stored 0%)
adding: directory/src/Work.file (stored 0%)
adding: directory/test.file (stored 0%)
Umanshield
źródło