我正在对 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