Copia automatica delle cartelle fino al raggiungimento di un determinato limite
Domanda
Saluti.
1 - Diciamo che ho circa 500 cartelle di dimensione variabile per un totale di 100 GB.
2 - Voglio distribuire queste cartelle automaticamente in altre cartelle fino al raggiungimento della dimensione di 700 MB con la migliore ottimizzazione dello spazio.
Esempio:Nella cartella "CD--01" voglio avere il massimo numero di cartelle possibili senza superare il limite di 700 MB, e così via in "CD--02", "CD--03"...
Esiste uno strumento che mi permette di farlo "al volo" o dovrò codificarne uno io stesso?
Grazie
Soluzione
Questa è una soluzione molto ingenuo e poco codificati, ma funziona. Il mio bash-fu non è forte, ma uno script di shell sembra il modo migliore per affrontare questo problema.
#!/bin/bash
dirnum=1
for i in *
do
if [ `du -b -s "$i" | cut -f 1` -gt 700000000 ]
then
echo "$i is too big for a single folder, skipping"
continue
fi
if [ ! -d "CD_$dirnum" ]
then
echo "creating directory CD_$dirnum"
mkdir "CD_$dirnum"
fi
echo "moving $i to CD_$dirnum"
mv "$i" "CD_$dirnum"
if [ `du -b -s "CD_$dirnum" | cut -f 1` -gt 700000000 ]
then
echo "CD_$dirnum is too big now"
mv "CD_$dirnum/$i" .
let "dirnum += 1"
if [ ! -d "CD_$dirnum" ]
then
echo "creating directory CD_$dirnum"
mkdir "CD_$dirnum"
fi
echo "moving $i to CD_$dirnum"
mv "$i" "CD_$dirnum"
fi
done
Altri suggerimenti
Alla fine stai chiedendo una soluzione al Problema dello zaino, che viene in molte forme.
Un approccio semplice sarebbe quello del seguente pseudocodice, ma questo lo farà non produrre soluzioni ottimali per tutti gli input (vedere gli articoli sopra).
while (there are unallocated files) {
create a new, empty directory
set remaining space to 700,000,000
while (the size of the smallest unallocated is at most (<=) the remaining space) {
copy into the current the largest unallocated file with size at most the remaining space
subtract that file's size from the remaining space
remove that file from the set of unallocated files
}
burn the current directory
}
(Naturalmente, ciò presuppone che nessun singolo file abbia dimensioni superiori a 700 MB.Se ciò è possibile, assicurati di rimuovere tali file dall'elenco non allocato, altrimenti quanto sopra produrrà infinite directory vuote!;-)
Se siete su UNIX (inc Mac OSX) è possibile creare script qualcosa come
tar cvzf allfolders.tgz ./allfolders
split allfolders.tgz -b 700m
Questo creerà un (compresso) archivio di tutte le cartelle e poi dividerlo in pezzi di dimensioni 700M. Tuttavia è necessario ricombinare tutti i pezzi poi estrarre di nuovo usando tar, quando si vuole ricostituire il set cartella originale.
Se si desidera mantenere loro come singole cartelle del sistema operativo sul CD, che è abbastanza difficile (in realtà penso che sia una specie di problema dello zaino, che è NP-hard).
Ci sono strumenti che lo farà - simile alla risposta di frankodwyer, WinZip vi toglierà il 100GB, zip su e dividerlo in qualsiasi 'pezzi' di dimensioni vuoi - vale a dire ~ 700MB