自动复制文件夹,直到达到特定限制

问题描述 投票:3回答:5

问候。

1-假设我有大约500个可变大小的文件夹,总大小为100 GB。

2-我想自动将这些文件夹分发到其他文件夹中,直到达到700 MB的大小并以最佳的空间优化。

示例:在文件夹“ CD--01”中,我希望在不超过700 MB限制的情况下具有最大数量的文件夹,以此类推,在“ CD--02”,“ CD--03”中...

有没有一种工具可以让我“即时”执行此操作,或者我必须自己编写一个代码?

谢谢

directory copying
5个回答
1
投票

这是一个非常幼稚且编码错误的解决方案,但它可以工作。我的bash-fu不强壮,但是shell脚本似乎是解决此问题的最佳方法。

#!/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

2
投票

最终您要为Knapsack Problem附带的in many forms寻求解决方案。

一种简单的方法是根据下面的伪代码,但这将not为所有输入产生最佳解决方案(请参阅上面的文章)。>>

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。如果可能,请确保从未分配的列表中删除任何此类文件,否则以上内容将产生无限多个空目录!;-)] >

如果您使用的是UNIX(Mac OSX),则可以编写类似的脚本

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

这将创建所有文件夹的(压缩)档案,然后将其拆分为700M大小的块。但是,当您要重新构造原始文件夹集时,需要重新组合所有片段,然后使用tar再次提取。

如果要将它们作为单独的OS文件夹保留在CD上,那是相当困难的(实际上,我认为这是一个背包问题,这是NP难题)。

[有一些工具可以执行此操作-与frankodwyer的答案类似,WinZip会占用您的100GB,将其压缩并拆分成您想要的任何大小的“块”-即〜700MB

这里[the page the WinZip split feature

我参加聚会有点晚了,但是这是我解决问题的方法:

#!/usr/bin/env bash

sourcedir="$1"
destdir_prefix="./disk_"
destdir_suffix=""
mblimit=4100
# bytelimit=$(( mblimit * 1024 * 1024 )) # MB as measured by OS (MiB)
bytelimit=$(( mblimit * 1000 * 1000 )) # MB as measured by marketeers
disk=() # empty array
dir_size=0
find "${sourcedir}" -type f |
  while read file; do

    file_size="$( stat --printf="%s" "${file}" )"
    disk_number=0
    stored=false
    while [[ "${stored}" == "false" ]]; do

      if [[ "${disk[$disk_number]}" == "" ]]; then
        disk[$disk_number]=0
      fi

      if [[ $(( disk[disk_number] + file_size )) -lt ${bytelimit} ]]; then
        dir="${destdir_prefix}${disk_number}${destdir_suffix}"
        mkdir -p "${dir}"
        filedir="$(echo ${file} | sed 's|[^/]*$||g')"
        mkdir -p "${dir}/${filedir}"
        disk[$disk_number]=$(( disk[disk_number] + file_size ))
        echo "${disk[$disk_number]} ${dir}/${file}"
        cp "${file}" "${dir}/${file}"
        stored=true
      else
        disk_number=$(( disk_number + 1 ))
      fi
    done
  done

这将创建名为disk_0,disk_1等的文件夹。对于每个文件,它都会尝试将文件适合disk_0,如果不合适,它将尝试disk_1等。


0
投票

如果您使用的是UNIX(Mac OSX),则可以编写类似的脚本


0
投票

[有一些工具可以执行此操作-与frankodwyer的答案类似,WinZip会占用您的100GB,将其压缩并拆分成您想要的任何大小的“块”-即〜700MB


0
投票

我参加聚会有点晚了,但是这是我解决问题的方法:

© www.soinside.com 2019 - 2024. All rights reserved.