3

ご挨拶。

1 - 合計サイズが 100 GB の可変サイズのフォルダーが約 500 個あるとします。

2 - スペースを最適化して 700 MB のサイズに達するまで、これらのフォルダーを他のフォルダーに自動的に配布したいと考えています。

例: フォルダ "CD--01" では、700 MB の制限を超えずに可能な最大数のフォルダを作成したいと考えています。"CD--02"、"CD--03" ...

これを「その場で」実行できるツールはありますか、それとも自分でコーディングする必要がありますか?

ありがとう

4

5 に答える 5

2

最終的に、あなたはナップザック問題の解決策を求めています。ナップザック問題はさまざまな形があります。

簡単なアプローチは次の疑似コードによるものですが、これはすべての入力に対して最適なソリューションを生成するわけではありません(上記の記事を参照してください)。

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
}

(もちろん、これは単一のファイルのサイズが 700MB を超えないことを前提としています。可能であれば、そのようなファイルを未割り当てリストから削除してください。そうしないと、上記の方法で無限に多くの空のディレクトリが作成されます! ;-)

于 2008-12-28T21:09:14.060 に答える
1

これは非常に素朴でコーディングが不十分なソリューションですが、機能します。私のbash-fuは強力ではありませんが、シェルスクリプトがこの問題に取り組むための最良の方法のようです。

#!/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
于 2008-12-28T02:14:37.097 に答える
0

UNIX(Mac OSXを含む)を使用している場合は、次のようなスクリプトを作成できます

tar cvzf allfolders.tgz ./allfolders
split allfolders.tgz -b 700m

これにより、すべてのフォルダーの (圧縮された) アーカイブが作成され、700M サイズのチャンクに分割されます。ただし、元のフォルダー セットを再構成する場合は、すべての断片を再結合してから tar を使用して再度抽出する必要があります。

それらを個別の OS フォルダとして CD に保持したい場合、それはかなり困難です (実際、これは一種のナップザックの問題であり、これは NP 困難だと思います)。

于 2008-12-27T22:11:36.993 に答える
0

これを行うツールがあります-frankodwyerの回答と同様に、WinZipは100GBを取得し、圧縮して任意のサイズの「チャンク」に分割します-つまり、〜700MB

WinZip 分割機能のページはこちら

于 2008-12-27T22:17:19.290 に答える