Come posso creare un archivio zip di un'intera directory tramite terminale senza file nascosti?


220

Ho un progetto con molte cartelle / file nascosti. Voglio crearne un archivio zip, ma nell'archivio non dovrebbero esserci cartelle / file nascosti. Se i file in una cartella nascosta non sono nascosti, non dovrebbero essere inclusi.

So che posso creare un archivio zip di una directory come questa:

zip -r zipfile.zip directory

So anche che posso escludere i file con l'opzione -x, quindi ho pensato che potesse funzionare:

zip -r zipfile.zip directory -x .*

Non ha funzionato Tutte le directory nascoste erano ancora nel file zip.

Risposte:


107

Ciò esclude anche i file nascosti nelle directory non nascoste:

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

2
Grazie per la tua risposta. Il comando ( find community-chess/ -path '*/.*' -prune -o -type f -print | zip ~/community-chess.zip -@) è più lungo del previsto, ma funziona bene. Sono incluse anche le sottodirectory, quindi +1 e una risposta accettata :-)
Martin Thoma,

105

Prima di tutto se non hai installato zip installalo prima come segue:

sudo apt-get install zip

Quindi, semplicemente per creare un file zip:

zip -r compressed_filename.zip foldername

Se si desidera escludere file nascosti:

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

Esclusione di file da un archivio zip (tratto da http://osxdaily.com/2013/04/30/how-to-exclude-files-from-a-zip-archive/ )

Le basi dell'esclusione dei file durante la creazione di un archivio zip sono centrate attorno al -xflag, che viene utilizzato per escludere i file dall'archivio che corrispondono a un nome o modello specifico. Al massimo, sembrerà così:

zip archive.zip files -x "ExcludeMe"

Ciò significa che potresti escludere un singolo file, ad esempio il nome "Nothanks.jpg"

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

Copriamo alcuni esempi specifici in cui questo è utile.

Escludere i file .DS_Store dagli archivi zip

Ciò impedirà che i .DS_Store file di metadati Mac normalmente invisibili vengano inclusi in un archivio zip, che sono raggruppati per impostazione predefinita:

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

Se la directory include sottodirectory, tuttavia, ti consigliamo di utilizzare un'altra variante di quel comando per escludere anche i file ds_store dalle sottodirectory:

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

Nota: non tutte le shell richiedono che le citazioni per questo comando funzionino correttamente, ma nella shell bash (impostazione predefinita per OS X) sarà necessario utilizzare le virgolette per l'esclusione con caratteri jolly e motivi.

Escludere tipi di file specifici da un archivio zip

Con i caratteri jolly, puoi anche escludere tutti i file di un certo tipo concentrandoti sull'estensione. Ad esempio, questo comando comprimerà un'intera directory, meno tutti i .jpgfile:

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

Che potrebbe essere modificato per qualsiasi specifica estensione o modello di file abbinato a un nome file.

Escludere la directory .git o .svn da un archivio zip

Comprimi una directory, meno .gite il suo contenuto:

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

Comprimi una cartella, senza includere la .svndirectory:

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

Escludere tutti i file nascosti da un archivio zip

Poiché è possibile utilizzare modelli e caratteri jolly, è possibile anche escludere uno o tutti i file e le cartelle invisibili creati con il prefisso di un punto, che si tratti di una directory simile .svno di un singolo file come .bash_profileo .htaccess.

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

O per escludere tutti i file invisibili da tutte le sottodirectory:

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

5
Grazie per il tuo sforzo di aiutare un altro utente Ubuntu. Si prega di tenere presente che la reimpostazione della risposta accettata in una nuova risposta aggiunge solo confusione e ha un'alta probabilità di essere contrassegnata per la rimozione.
hmayag,

54

Aggiungi "a .*(altrimenti, la tua shell si espande .*nei file punto nella directory corrente) ed esclude anche i file nascosti nelle sottodirectory:

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

Ciò comporterà che i file che iniziano con un .non devono essere aggiunti al file 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%)

1
Non penso che la tua ultima affermazione sia corretta. .*sarebbe espanso dalla shell.
Hammar,

1
Penso che probabilmente sia corretto ma l'ho rimosso (non ne sono sicuro) :)
Rinzwind

questo non ha funzionato. Sono state aggiunte le directory .svn
Martin Thoma il

1
@moose Il modello exclude corrisponde al percorso completo, non solo al nome della base file, quindi è necessario escludere */.*nonché .*( */corrisponde a qualsiasi sequenza non vuota di directory).
Gilles,

Funziona senza cambiare nulla! Migliore risposta.
Whitecat,

8

Questo include tutto "." directory, sottodirectory e "." file o directory all'interno di directory ... Essenzialmente la prima risposta ma include il livello "." File.

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

8

Esempio per escludere tutte le cartelle che iniziano con. :

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

Comprimere meglio ma più lentamente:

tar cvpjf folder.tar.bz2 folder/ --exclude '.*'

5

Il metodo corretto sarebbe:

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

@downvoter: Cosa c'è che non va, questo sembra funzionare per me.
Jobin

Stesso problema con la risposta originale di Rinzwind (ora corretta): non si escludono le sottodirectory. E come notato da Rinzwind, è necessario citare i caratteri jolly, altrimenti la shell li espanderà.
Gilles,

4

Mentre comprimi le directory escludendo alcune estensioni di file:

$ cd /path/to/dir
$ zip -r dir.zip . -x "*.log" -x "*.cache"

3

Senza cartelle e file nascosti nella directory:

zip -r zipfile.zip directory/*

directory: |── .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%)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.