Copia automatica delle cartelle fino al raggiungimento di un determinato limite

StackOverflow https://stackoverflow.com/questions/395424

  •  23-08-2019
  •  | 
  •  

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

È stato utile?

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

Ecco pagina la funzione di divisione WinZip

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top