filesize=0
for i in *; do
filesize=$(stat -c "%s" "$i");
(( totalsize += filesize ));
if [[ $totalsize < 322122547200 ]]; then
mv "$i" first_300/
else
mv "$i" the_rest/
fi
done
希望 int 的大小没有问题。
如果您的意思是将它们分成文件夹,每个文件夹包含 300 个文件,那么您可能需要以下内容:
folder=0
counter=0
for i in *; do
mv $i foo_$folder/
if [[ $(( counter % 10 )) -eq 0 ]]; then
(( folder++ ));
fi
(( counter++ ))
done
尽管这可能不如某些 find 命令快。如果您只想执行第一个 300 命令,则可以使用相同的计数器策略,但使用 while $counter -le 300。
更新:哦,前 300GB,那么……这可能很慢,取决于文件大小,但我喜欢这个练习 :-)
希望 int 的大小没有问题。
如果您的意思是将它们分成文件夹,每个文件夹包含 300 个文件,那么您可能需要以下内容:
尽管这可能不如某些 find 命令快。如果您只想执行第一个 300 命令,则可以使用相同的计数器策略,但使用 while $counter -le 300。
这是一种获得几乎相等的 300gb 分布的方法,
您可以进行
du
基于搜索以查找顶级目录和文件的分布,然后通过一些试验将它们分成近两部分。这将给出一个排序的
KB
大小列表。您可以做一个技巧,例如在此列表中选择备用行,以实现快速几乎均匀的分布
一个非常粗略的分布...
最后,如果您的文件或目录大小非常不均匀——与 300GB 分布相差甚远,
请远离装箱问题,并在两个列表文件之间移动几行进行一些简单的试验。
找到两组之间的差异(带
du
)并将一个目录/文件从较大列表移动到较小列表的差异大约一半。
那应该让你非常接近
您可以使用find、head和xargs来做到这一点。它应该如下所示:
警告!当您开始计算文件大小时,您很可能会错误地以字节来衡量它们,而大多数文件系统会以块为单位分配磁盘空间。这个块大小因磁盘而异,但通常是 512 的倍数。
基本上,这意味着您可以拥有 500 个文件,每个文件只有 500 个字节。但是一个为每个块分配 2048 字节的文件系统因此会占用大约 1 兆字节的磁盘空间。是的,这是很多开销。
基本上,您应该通过您使用的文件系统的块大小来四舍五入获得的文件大小。这样,您可以更精确地测量它们。
话又说回来,有多大的区别?如果块大小为 2048 字节,则“丢失”的平均字节数将为 1 KB。对于 300 个文件,这将是大约 300 KB,除了总大小之外,您还需要更多。您想复制 300 GB,但要复制多少个文件?两个磁盘是否使用具有相同块大小的相同文件系统?
无论如何,误差范围取决于平均文件大小。如果您有很多大文件(音乐、图像、二进制文件),则误差范围会非常小。如果您有很多小文件(如脚本、源文件和文本文件),那么误差范围可能很容易使总文件大小再增加 30 GB,这是您没有考虑的...
所以,测量文件大小并不容易......
您可以通过拉出大小
ls -l
或使用以下du
命令来获取文件使用情况列表:$ cd /dirwithlotsoffiles $ du -k *
这将打印以千字节为单位的文件大小列表,后跟文件名。
“查找”答案将复制前 300 个文件,而不是我理解的请求的前 300GB。
您可以尝试使用 tar 及其多卷选项
一种非常粗略的方法是遍历按大小排序的文件(ls -S),然后简单地将每个备用文件移动到其中一个子目录中。这个怎么样:
~
恐怕您可能不得不在这里编写一些脚本。您可以使用终端命令 ls -l 轻松获取文件列表及其大小,然后您必须编写一个脚本来遍历该列表并逐个复制文件并保留一个计数器来记录文件的数量KB 传输至今。每次检查我们是否移动了 300GB 的值,如果没有,移动另一个文件。它可能在大约 10 行或更少的 Perl 中是可行的。
您可以通过简单地获取文件名列表以及每个文件的大小来获得合理的结果。首先按照最大的大小对文件进行排序。然后只需复制列表中适合目标目录剩余空间的最大文件并将其从列表中删除。重复直到没有更多的文件适合。
然后从新的目标目录重新开始。重复直到列表为空。