Ho una singola directory che contiene dozzine di directory al suo interno.
Sono nuovo della riga di comando e sto lottando per trovare un comando che comprimerà ogni sottodirectory in un file sub-directory.zip univoco.
Quindi alla fine la mia directory principale verrà riempita con tutte le mie sottodirectory originali, più il corrispondente .zip
file che contengono il contenuto compresso di ciascuna sottodirectory.
È possibile una cosa del genere? In tal caso, mostrami come si fa.
Risposta accettata:
Puoi usare questo loop in bash
:
for i in */; do zip -r "${i%/}.zip" "$i"; done
i
è il nome della variabile di ciclo. */
indica ogni sottodirectory della directory corrente e includerà una barra finale in quei nomi. Assicurati di cd
nel posto giusto prima di eseguire questa operazione. "$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 $i
ma con la barra finale rimossa, quindi puoi usarla per costruire il nome del file zip.
Se vuoi vedere come funziona, includi un echo
prima del zip
e vedrai i comandi stampati invece che eseguiti.
Esecuzione parallela
Per eseguirli in parallelo puoi usare &
:
for i in */; do zip -0 -r "${i%/}.zip" "$i" & done; wait
Usiamo wait
per dire alla shell di attendere il completamento di tutte le attività in background prima di uscire.
Fai attenzione che se hai troppe cartelle nella tua directory corrente, potresti sovraccaricare il tuo computer poiché questo codice non limita il numero di attività parallele.