Crea un file zip e ignora la struttura delle directory


219

Devo creare un file zip usando questo comando:

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

Funziona, ma il file zip creato crea una struttura di directory che imita la directory nel file non elaborato. Sono molte cartelle extra che non mi servono.

Non ho trovato una risposta in una rapida occhiata sulla pagina man o su una caccia a Google.



2
Stavo pensando che questa domanda fosse antecedente a tutti gli altri scambi di stack, ma il post del superuser in realtà è più vecchio di questo. Se c'è qualcosa che posso fare qui per farmi sapere. Questa deve essere la risposta più accesa poiché google continua a indirizzare così tanto traffico qui. : D
Jake,

Risposte:


354

È possibile utilizzare -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).

20
Se -jnon funziona per la tua directory (insieme a -r) controlla questa risposta
czerasz

a volte semplicemente non funziona ... preferisco il link @czerasz;) che in pratica è una combinazione popd
pushd

36

L'uso -jnon funzionerà insieme -rall'opzione.
Quindi la soluzione può essere questa:

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

O versione in linea

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

puoi indirizzare l'output a /dev/nullse non vuoi che l' cd -output appaia sullo schermo


In realtà, potresti voler fare quanto segue:cd path/to/parent/dir/ && zip -r ../../../../name.zip ./* && cd -
eddyP23

@ eddyP23 Come fa la differenza? Piuttosto ti farà aggiungere no. di parentDir (..) per ogni directory nel percorso: |
Vikas Tawniya,

Il risultato è lo stesso, sono d'accordo. Ma negli script automatici eseguiti in molti ambienti diversi, di solito eviti i percorsi globali, perché non hai idea di quale sarà il percorso globale. Ma dal cd path/to/parent/dir/puoi calcolare ../facilmente il numero di punti doppi .
eddyP23

@ eddyP23 ha un senso
Vikas Tawniya,

33

Usa l' -jopzione:

   -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

In alternativa, è possibile creare un collegamento simbolico temporaneo al file:

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

Questo funziona anche per una directory.


1

Conserva la directory principale in modo da unzipnon spargere file ovunque

Quando si comprimono le directory, mantenere la directory principale nell'archivio aiuterà a evitare di sporcare la directory corrente quando successivamente si decomprime il file di archivio

Quindi, per evitare di conservare tutti i percorsi, e poiché non puoi usare -j e -r insieme (otterrai un errore), puoi invece farlo:

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

Il ../$(basename $PWD)è la magia che mantiene la directory padre.

Quindi ora unzip my.zipfornirà una cartella contenente tutti i tuoi file:

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

Invece di sporcare la directory corrente con i file decompressi:

file1
file2
dir1
├── file3
├── file4

0

Basta usare l' -jrmopzione per rimuovere le strutture di file e directory

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

state attenti, -m --move Sposta i file specificati nell'archivio zip; in realtà, questo elimina le directory / i file di destinazione dopo aver creato l'archivio zip specificato. Se una directory diventa vuota dopo la rimozione dei file, anche la directory viene rimossa. Non vengono eseguite cancellazioni finché zip non ha creato l'archivio senza errori. Questo è utile per conservare lo spazio su disco, ma è potenzialmente pericoloso, quindi si consiglia di usarlo in combinazione con -T per testare l'archivio prima di rimuovere tutti i file di input.
catalizzatore
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.