No Linux, você poderia fazer algo assim para deixar apenas 1M *:
avail=$( df --output=source,avail -BM | grep sda6 |
awk '{print $NF}' | sed s/M//i); size=$((avail-left) );
fallocate -l $sizeM filler_file;
O truque é analisar df
para obter o espaço disponível e, em seguida, usar fallocate
para criar um arquivo com o tamanho necessário. No entanto, como @jjlin apontou out , a chamada fallocate
não funcionará em todos os sistemas de arquivos.
Você pode transformar o pequeno script acima em uma função para facilitar o uso e também usar um método alternativo para criar o arquivo quando em um sistema de arquivos que não suporta fallocate
(embora fallocate
seja muito mais rápido e deve ser preferido sempre que possível). Basta adicionar essas linhas ao seu ~/.bashrc
(ou equivalente para outros shells):
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
}
Você pode iniciá-lo assim:
fill_disk desired_free_space unit target_disk out_file
Por exemplo, para criar um arquivo chamado /foo.txt
, que deixará apenas 100 M livres em /
( sda1
), execute
fill_disk 100 M sda1 /foo.txt
Apenas verifique se o arquivo de destino está na unidade que deseja preencher , a função não verifica isso.
* Não consegui que funcionasse de maneira confiável para tamanhos pequenos, ou ficaria sem espaço ou me daria valores ligeiramente diferentes daqueles que solicitei.
Conforme solicitado, aqui está a mesma coisa que um script:
#!/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
Salve-o como fill_disk.sh
e execute assim:
bash fill_disk.sh 100 M sda1 /foo.txt