1

Я занимаюсь тестированием продукта на устройствах Apple и Android. Мне нужен скрипт, который будет заполнять жесткий диск устройства до тех пор, пока на диске, с которым он работает, не останется 100 КБ места. Также в системах Linux я использую dd if =/dev/zero of = нули bs = 1M, чтобы полностью заполнить жесткий диск, но .. Как сделать так, чтобы он заполнял жесткий диск до тех пор, пока не останется определенное количество места? Я хотел бы это как для командной строки Linux или сценария летучей мыши (Windows) Пример сценария оболочки и пакетного сценария Windows будет лучшим! Спасибо!

2 ответа2

4

Вам нужно написать настоящий файл или достаточно пустых файлов? Используемый вами метод dd будет довольно медленным для больших дисков. , ,

В Windows вы можете использовать fsutil file createnew <filename> <length_in_bytes> который создаст файл-заполнитель. Вот техническая страница с некоторыми подробностями.

В linux fallocate работает аналогично, например, fallocate -l 10G 10gig_filler . Вот предыдущий вопрос SU о создании файлов-заполнителей, а также немного более техническая версия Stack Overflow .

0

В 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 (или эквивалент для других оболочек):

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
}

Затем вы можете запустить его так:

Заполнить_диск нужный_свободный_объект целевой_диск out_file

Например, чтобы создать файл с именем /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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .