填满硬盘直到剩余一定量的空间?

填满硬盘直到剩余一定量的空间?

我正在对 Apple 和 Android 设备上的产品进行测试。我想要一个脚本,它可以填满设备硬盘,直到它运行的驱动器上剩下 100KB 的空间。此外,在 Linux 系统中,我使用 dd if=/dev/zero of=zeros bs=1M 来完全填满硬盘,但是......我如何让它填满硬盘,直到剩下一定数量的空间?我希望它既适用于 Linux 命令行,也适用于 bat 脚本(Windows)。最好有 shell 脚本和 Windows 批处理脚本的示例!谢谢!

答案1

您需要写入真实文件吗?还是虚拟文件就足够了?dd您使用的方法对于大型驱动器来说会非常慢...

在 Windows 中,您可以使用fsutil file createnew <filename> <length_in_bytes>它将创建一个填充文件。以下是technet 页面上有更多详细信息

在 Linux 中,fallocate工作原理类似,例如fallocate -l 10G 10gig_filler。这是一个上一个 SU 问题创建填充文件,以及Stack Overflow 上技术含量略高的版本

答案2

在 Linux 中,你可以做这样的事情来只留下 1M*:

avail=$( df --output=source,avail -BM | grep sda6 | 
        awk '{print $NF}' | sed s/M//i); size=$((avail-left)  ); 
fallocate -l $sizeM filler_file;

诀窍是解析df以获得可用空间,然后使用它fallocate来创建所需大小的文件。但是,正如@jjlin指出,该fallocate调用将不会在所有文件系统上起作用。

您可以将上面的小脚本变成一个函数,以使其更易于使用,并让它使用替代方法在不支持的文件系统上创建文件fallocate(尽管fallocate很多速度更快,应尽可能优先使用)。只需将这些行添加到您的~/.bashrc(或其他 shell 的等效行):

fill_disk(){
    ## The space you want left
    left=$1 
    ## The unit you are using (Units are K, M, G,  T,  P, E, Z, Y (powers of 1024) or 
    ## KB, MB, ... (powers of 1000).
    unit=$2 
    ## The target drive
    disk=$3 
    ## The file name to create, make sure it is on the right drive.
    outfile=$4
    ## The space currently available on the target drive
    avail=$(df --output=source,avail -B$unit | grep $disk | awk '{print $NF}' | sed s/$unit//i); 
    ## The size of the file to be created
    size=$((avail-left))
    ## Skip if the available free space is already less than what requested
    if [ "$size" -gt 0 ]; then
    ## Use fallocate if possible, fall back to head otherwise
    fallocate -l $size$unit $outfile 2>/dev/null || head -c $size$unit /dev/zero > $outfile
    else 
    echo "There is already less then $left space available on $disk"
    fi
}

然后你可以像这样启动它:

填充磁盘 所需可用空间 单位 目标磁盘 输出文件

例如,要创建一个名为的文件,该文件在( )/foo.txt上只留下 100M 的可用空间,请运行/sda1

fill_disk 100 M sda1 /foo.txt

只是确保目标文件位于要填充的驱动器上,该函数不会检查这一点。

* 我无法让它在小尺寸的情况下可靠地工作,要么它会耗尽空间,要么给我与我请求的值略有不同的值。


根据要求,这是与脚本相同的东西:

#!/bin/env/bash
left=$1 
unit=$2 
disk=$3 
outfile=$4
avail=$(df --output=source,avail -B$unit | grep $disk | awk '{print $NF}' | sed s/$unit//i); 
size=$((avail-left))
if [ "$size" -gt 0 ]; then
  fallocate -l $size$unit $outfile 2>/dev/null || head -c $size$unit /dev/zero > $outfile
else 
  echo "There is already less then $left space available on $disk"
fi

将其保存为fill_disk.sh并运行如下:

bash fill_disk.sh 100 M sda1 /foo.txt

相关内容