comando per comprimere più directory in singoli file zip


40

Ho una sola directory che contiene dozzine di directory al suo interno.

Sono nuovo alla riga di comando e faccio fatica a trovare un comando che comprimerà ogni sottodirectory in un unico file sottodirectory.zip.

Quindi alla fine la mia directory principale verrà riempita con tutte le mie sottodirectory originali, più i .zipfile corrispondenti che contengono il contenuto compresso di ogni sottodirectory.

È possibile qualcosa del genere? Se è così, per favore mostrami come è fatto.


Ti suggerisco di cercare come "per i loop" può essere fatto nella shell. Ci sono onliner che possono fare quello che vuoi, ma un bel giro sarà molto più chiaro.
Lynxlynxlynx,

Quindi questo significa che devo scrivere uno script shell separato e quindi chiamare quello script dalla riga di comando? Ci scusiamo per una domanda così elementare. Anche se ho una certa esperienza di programmazione, questa roba è nuova per me.
Evster

Risposte:


76

Puoi usare questo loop in bash:

for i in */; do zip -r "${i%/}.zip" "$i"; done

iè il nome della variabile loop. */indica ogni sottodirectory della directory corrente e includerà una barra finale in quei nomi. Assicurati di cdessere nel posto giusto prima di eseguire questo. "$i"nomina semplicemente quella directory, inclusa la barra finale. Le virgolette assicurano che gli spazi bianchi nel nome della directory non causino problemi. ${i%/}è come $ima con la barra finale rimossa, quindi puoi usarla per costruire il nome del file zip.

Se vuoi vedere come funziona, includi echoprima di zipe vedrai i comandi stampati anziché eseguiti.


Grazie, sembra fantastico! Comunque un potenziale problema a cui ho pensato: comprimerà TUTTE le directory all'interno di ogni sottodirectory in file separati? Voglio solo comprimere le sottodirectory di primo livello come singoli file compressi. Non voglio creare file zip aggiuntivi per le sottodirectory di 2 ° livello, 3 ° livello, ecc ... Per favore fatemi sapere se questo ha senso. Grazie ancora!
Evster

Solo quelli di primo livello come te hanno richiesto.
Lynxlynxlynx,

I */nomi di ogni sottodirectory diretta, non tutte le directory discendente. Quindi otterrai solo le zip per il livello più alto, proprio come le desideri. La versione con echodentro avrebbe dimostrato quell'aspetto. Comprimere ogni directory nidificata nel proprio file sarebbe in effetti più lavoro, e probabilmente sarebbe meglio risolverlo usando find -type dtra gli altri trucchi.
MvG

1
@fritzmg: un test locale sul mio Linux suggerisce che sì, i file che iniziano con un punto sono inclusi. Questa sarebbe una proprietà dello strumento Info-ZIP, non del comando che ho dato, quindi a seconda di quale sia il tuo zipbinario potresti avere un comportamento diverso. Per creare anche file zip per le directory di livello superiore (ovvero i figli della directory corrente) che iniziano con un punto, è possibile utilizzare anche shopt -s dotglobper far corrispondere i pattern glob anche ai file nascosti.
MvG

1
Per creare uno zip che non abbia la directory principale come root:for i in */; do (cd "$i"; zip -r "../${i%/}.zip" .); done
chris
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.